2016-08-07 35 views
1

Ich habe eine Tabellenansicht mit zwei Abschnitten und einem benutzerdefinierten Häkchen, das bei der Auswahl einer Zelle angezeigt wird.swift ios tableview mit benutzerdefiniertem Häkchen hält die Zelle beim Scrollen erneut an

Das einzige Problem ist, wenn ich eine Zelle auswählen und nach unten scrollen, wird die Zelle jedes Mal neu ausgewählt, wenn die Zelle auf dem Bildschirm erscheint, und alle anderen Zellen werden wieder ausgeblendet.

So wie kann ich machen, dass eine Zelle nur einmal ausgewählt/deaktiviert wird.

mein Code:

//Keep track of selected row 
    var selectedRow: NSIndexPath? = NSIndexPath(forRow: 0, inSection: 0) 

    func loadStates() { 
     ApiService.getStates() { (JSON) ->() in 
      self.states = JSON["stateData"] 
      self.tableView.reloadData() 
      let index = NSIndexPath(forRow: 0, inSection: 0) 
      self.tableView.selectRowAtIndexPath(index, animated: true, scrollPosition: UITableViewScrollPosition.Top) 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     tableView.delegate = self 
     tableView.dataSource = self 
     loadStates() 
    } 

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

     let paths:[NSIndexPath] 

     if let previous = selectedRow { 
      paths = [indexPath, previous] 
     } else { 
      paths = [indexPath] 
     } 
     selectedRow = indexPath 
     tableView.reloadRowsAtIndexPaths(paths, withRowAnimation: .None) 

     if (indexPath.section == 1) { 
      tableView.deselectRowAtIndexPath(indexPath, animated: false) 
      performSegueWithIdentifier("searchCitySegue", sender: indexPath) 
     }else { 
      tableView.deselectRowAtIndexPath(indexPath, animated: false) 
      dismissViewControllerAnimated(true, completion: nil) 
     } 

    } 

    func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 2 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     if (section == 1){ 
      return states.count 
     } 
     return 1 
    } 

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

     var cell: searchStateTableViewCell! 

     if (indexPath.section == 0) { 
      cell = tableView.dequeueReusableCellWithIdentifier("staticStateCell") as! searchStateTableViewCell 
      cell.titleLabel?.text = "All states" 

      if indexPath == selectedRow { 
       cell.stateImage.select() 
      } else { 
       cell.stateImage.deselect() 
      } 

     }else if (indexPath.section == 1) { 
      cell = tableView.dequeueReusableCellWithIdentifier("stateCell") as! searchStateTableViewCell 
      let state = states[indexPath.row] 
      cell.configureWithStates(state) 
      if indexPath == selectedRow { 
       cell.stateImage.select() 
      } else { 
       cell.stateImage.deselect() 
      } 
     } 

     return cell 

    } 

Also, was meine Zelle verursacht die ausgewählte Animation laufen, sobald es auf dem Bildschirm jedes Mal reapears?

Antwort

2

Ich bin mir ziemlich sicher, dass es da cellForRowAtIndexPath mit diesem Code ist:

if indexPath == selectedRow { 
    cell.stateImage.select() 
} 
else { 
    cell.stateImage.deselect() 
} 

jedes Mal aufgerufen wird, die Zelle erscheint. Versuchen:

if indexPath == selectedRow { 
    if !(cell.selected) { 
     cell.stateImage.select() 
    } 
} 
else { 
    cell.stateImage.deselect() 
} 
+1

Ich habe versucht, den Code zu implementieren, aber die Zelle noch neu ausgewählt wird, wenn ich nach unten scrollen dann wieder nach oben, so dass es auf dem Bildschirm sichtbar wird:/ – user2636197

+0

@ user2636197 ersetzen (cell.selected) mit dem, was Logik In Ihrem Code wird festgelegt, ob sich die Zelle bereits im ausgewählten Status befindet. Auf diese Weise wird es nicht versuchen, es wieder in den ausgewählten Zustand zu versetzen. – Shades

+0

Ich habe es 'versucht' 'wenn indexPath == SelectedRow { if! Cell.stateImage.selected { cell.stateImage.select() print ("Normalbild") } } else { wenn cell.stateImage .selected { cell.stateImage.deselect() print ("abzuwählen normal") } } '' ' Sobald die Zelle Bildschirm gescrollt wird und wieder abgewählt wird dann wieder ausgewählt. Es ist wirklich nervig zu sehen, dass die Auswahl-Animation jedes Mal ausgeführt wird, wenn ich zurück/viert scrolle – user2636197