2016-04-03 9 views
1

UITableViewの行にUIStepperを表示する必要があります(2番目の行のみ - 下の画像を参照)。UITableViewCell内のUIStepperがタップ時に問題になる

。したがって、私は以下のようにfunc tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellを実装:私は実際のデバイス上でUIStepperをタッチすると

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("OptionCell")! 
    let debugModeOptionType = DebugModeOptionsType(rawValue: indexPath.row) 

    switch(debugModeOptionType!) { 
    case .DummyCurrentLocation: 
    cell.textLabel!.text = "Dummy current location" 
    case .StepLength: 
    cell.textLabel!.text = "Step Length: \(stepLength)" 

    // create a UIStepper 
    let stepper = UIStepper(frame: CGRectMake(220, 10, 100, 10)) 

    // customize UIStepper 
    stepper.autorepeat = true 
    stepper.value = stepLength 
    stepper.minimumValue = 0.1 
    stepper.stepValue = 0.02 
    stepper.maximumValue = 1.5 

    stepper.addTarget(self, action: #selector(adjustStepLength(_:)), forControlEvents: UIControlEvents.AllEvents) 

    // add UIStepper into the cell 
    stepper.translatesAutoresizingMaskIntoConstraints = false 
    cell.contentView.addSubview(stepper) 

    case .TrueHeading: 
     cell.textLabel?.text = "True Heading: \(trueHeading)" 
    case .MagneticHeading: 
     cell.textLabel?.text = "Magnetic Heading: \(magneticHeading)" 
    case .HeadingAccuracy: 
     cell.textLabel?.text = "Heading Accuracy: \(headingAccuracy)" 
    case .CurrentDirection: 
     cell.textLabel?.text = "Current Direction: \(currentDirection)" 
    case .DrawWalking: 
     cell.textLabel?.text = "Draw walking while navigating" 
    } 

    if selectedDebugModeOptions.contains(debugModeOptionType!) { 
     cell.accessoryType = UITableViewCellAccessoryType.Checkmark 
    } else { 
     cell.accessoryType = UITableViewCellAccessoryType.None 
    } 

    return cell 
} 

しかし(これは、シミュレータの内部で発生しません)次の処理が行われます。

UIStepper inside UITableViewCell

これが起こると、他のセルのUISteppersも点滅し始めます。なぜこのような問題が起こるのですか?

答えて

2

なぜ実際のデバイスでのみ起こっているのかわかりませんが、テーブルビューのセルが再利用されるため、要素をセルにプログラムで追加する際には注意が必要です(ステッパーなど)。細胞が再使用されるときに他の細胞に広がる。

あなたがこれに対処することができます(少なくとも)2つの方法があります。あなたは、再利用可能なセルをデキューし、それはdoesnの行にある場合は、それを削除した後

  1. はステッパーの存在をチェックステッパーが必要です。これを行うには、ステッパーに固有のタグ番号(123など)を与え、そのタグでサブビューを検索して削除します。

    let stepperTagNumber = 123 
    let cell = tableView.dequeueReusableCellWithIdentifier("OptionCell")! 
    let debugModeOptionType = DebugModeOptionsType(rawValue: indexPath.row) 
    
    if let stepper = cell.contentView.viewWithTag(stepperTagNumber) { 
        // We have a stepper but don't need it, so remove it. 
        if debugModeOptionType != .StepLength { 
         stepper.removeFromSuperview() 
        } 
    } else { 
        // We don't have a stepper, but need one. 
        if debugModeOptionType == .StepLength { 
         // create a UIStepper 
         let stepper = UIStepper(frame: CGRectMake(220, 10, 100, 10)) 
         stepper.tag = stepperTagNumber // This is key, don't forget to set the tag 
    
         // customize UIStepper 
         stepper.autorepeat = true 
         stepper.value = stepLength 
         stepper.minimumValue = 0.1 
         stepper.stepValue = 0.02 
         stepper.maximumValue = 1.5 
    
         stepper.addTarget(self, action: #selector(adjustStepLength(_:)), forControlEvents: UIControlEvents.AllEvents) 
    
         // add UIStepper into the cell 
         stepper.translatesAutoresizingMaskIntoConstraints = false 
         cell.contentView.addSubview(stepper) 
        } 
    } 
    

    OR:

  2. "OptionCellWithStepper"と呼ばれる)あなたのテーブルビューのための第二のプロトタイプのセルを作成します。ストーリーボードのそのセルにステッパーを追加します。次に、dequeueReusableCellWithIdentifierに電話するときは、.StepLengthの場合は"OptionCellWithStepper"を使用し、それ以外の場合は識別子"OptionCell"を使用します。このようにすると、プログラムでステッパーを追加する必要がなくなり、他のセルのステッカーを削除することを忘れてはいけません。

    let debugModeOptionType = DebugModeOptionsType(rawValue: indexPath.row) 
    let cellID = (debugModeOptionType == .StepLength) ? "OptionCellWithStepper" : "OptionCell" 
    let cell = tableView.dequeueReusableCellWithIdentifier(cellID)! 
    
+0

は、あなたのオプションのいずれかで行ってきました。どうもありがとう –

関連する問題