2016-09-17 4 views
1

Ich habe eine UITableView, die Prototyp cells hat, die einen Schieberegler und eine textfield daneben enthalten. Wenn sich der Schiebereglerwert ändert, wird auch der Wert in textview geändert. Es funktioniert gut, außer wenn die Größe der Tabelle zunimmt, zeigt die neue cell, die beim Herunterscrollen erzeugt wird, bereits den Wert der ersten Zelle an. Ich weiß, dass dies etwas mit der dequeueReusableCellWithIdentifier Funktion zu tun hat, da die cells wiederverwendet werden. Wie kann dies umgangen werden?Mit Schieberegler in benutzerdefinierten Zelle eines UITableView

Dies ist der Code:

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 

} 

ich einen Screenshot bin Befestigung. Beachten Sie, dass beim Scrollen nach unten die neue Zelle den gleichen Wert wie die erste Zelle hat, die zweite Zelle den gleichen Wert wie die zweite Zelle hat und so weiter.

enter image description here

+0

Zeigen Sie den Code von 'CellForRowAtIndexPath' ohne es zu wissen, dass Ihnen einer helfen wird. –

Antwort

0

Da Zellen wiederverwendet werden, wird der Schieber den Wert aus der vorherigen Zeit behalten die Zelle verwendet wurde. Achten Sie darauf, den Schieber in cellForRowAtIndexPath immer zu initialisieren:

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

Das Problem dabei ist, dass wenn ich nach dem Ändern der Werte zurück scrollen, der Wert des ersten Sliders zusammen mit den Werten anderer nachfolgender Schieberegler ebenfalls auf 0 gesetzt –

+1

Sie sollten Ihre Tabellenzellen nicht verwenden, um Daten zu speichern. Wenn ein Schieberegler verschoben wird, sollten Sie diesen Wert in einem Modell speichern, das unabhängig von der Zelle ist. Am einfachsten ist es, wenn Sie eine Eigenschaft des View-Controllers haben, die Schiebereglerwerte wie ein Array beibehält und den Wert in diesem Array aktualisiert, wenn sich der Schieberegler ändert. Außerdem liest cellForRowAtIndexPath den Wert aus diesem Array, wenn eine Zelle eingerichtet wird. – vacawama

0

Sie haben zu speichern Wert von Regler nach inputArrayFortableView, wenn der Wert geändert wird. Sie müssen diesen Wert jedes Mal neu laden, wenn func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell aufgerufen wird, da Tabellenzellen wiederverwendet werden, speichert sie den alten Wert.

Verwandte Themen