2016-09-17 6 views
1

私は、スライダとその隣にtextfieldというプロトタイプcellsを持つUITableViewを持っています。スライダの値が変更されると、textviewの値も変更されます。テーブルのサイズが大きくなる場合を除いては正常に動作しますが、スクロールダウン時に新たに生成されたcellはすでに最初のセルの値を示しています。私はこれがdequeueReusableCellWithIdentifierの機能と関係があり、cellsが再利用されていることを認識しています。どのようにこれを回避することができますか?UITableViewのカスタムセルでスライダを使用

これはコードです:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = self.tableView.dequeueReusableCellWithIdentifier("infoCell") as! InfoCell 

    cell.dressLabel.text = inputArrayFortableView[indexPath.row] 

    cell.uiSlider.maximumValue = 100 
    cell.uiSlider.minimumValue = 0 
    cell.uiSlider.continuous = true 
    cell.uiSlider.addTarget(cell, action: #selector(cell.uiSliderSetValue), forControlEvents: .ValueChanged) 

    if(cell.DressTextField.text != "") 
     { 
      cell.uiSlider.setValue(Float(cell.DressTextField.text!)!, animated: true) 
     } 

    print("outside uisliderSetvalue") 
    cell.uiSlider.tag = indexPath.row 
    print(cell.uiSlider.tag) 

    return cell 

} 

私はスクリーンショットを添付しています。下にスクロールすると、新しいセルは最初のセルと同じ値を持ち、生成された2番目のセルは2番目のセルと同じ値を持ちます。

enter image description here

+0

'cellForRowAtIndexPath'のコードを表示して、わかりやすく解説します。 –

答えて

0

細胞が再利用されるので、スライダは、セルが使用された前回の値を保持します。常にcellForRowAtIndexPathにスライダーを初期化することを確認してください:

if cell.DressTextField.text != "" 
{ 
    cell.uiSlider.setValue(Float(cell.DressTextField.text!)!, animated: true) 
} else { 
    cell.uiSlider.setValue(0, animated: false) 
} 
+0

これを行う際の問題は、値を変更した後にスクロールすると、最初のスライダの値がほかのスライダの値とともに0に設定されることです。 –

+1

データを格納するためにテーブルセルを使用しないでください。スライダを移動するときは、その値をセルとは独立したモデルに保存する必要があります。最も簡単なことは、配列などのスライダ値を保持し、スライダが変更されたときにその配列の値を更新するView Controllerのプロパティを持つことです。また、cellForRowAtIndexPathは、セルを設定するときにその配列から値を読み取ります。 – vacawama

0

あなたは値が変更されたときにinputArrayFortableViewにスライダーの値を格納する必要があります。 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell呼び出しのたびにこの値を再ロードする必要があります。これは、表のセルが再利用されているため古い値を格納するためです。

関連する問題