I will respond to this directly to Ole - as I was informed this was not the correct list for such discussions, and I have since unsubscribed and subscribed to the cocoa-dev list instead. Many thanks…
—fish (Adam Stoller) > On Sep 12, 2016, at 18:41, Ole Begemann <o...@oleb.net> wrote: > > > Hmm - interesting to know. Unfortunately, if I do that, then I get > > NO indication of selection when I click on ANY row. Perhaps I need > > to make some other changes to account for the change in how I get the > > cell? > > You also need to store your cells' selection state someplace outside of the > cells themselves. The cells should not be the "source of truth" for the > selection state. Otherwise, when you scroll a cell off screen and then scroll > it back, it will lose its state. > > So you should store the selection state of each table row somewhere alongside > your `locationList` array. Maybe as an array of pairs like this: > > var locationList: [(location: LocationObject, selected: Bool)] = [ > ( > location: LocationObject(name: "name-1", address: "addr-1", phone: > "phone-1", latitude: 40.0, longitude: -80.1), > selected: false > ), > ( > location: LocationObject(name: "name-2", address: "addr-2", phone: > "phone-2", latitude: 40.0, longitude: -80.1), > selected: false > ) > ] > > There may be better ways to structure your model data, but this should > suffice for now. > > Then: > > 1. In `tableView(_:cellForRowAtIndexPath:)`, use the current value of > `item.selected` to configure the cell's selection state: > > override func tableView(tableView: UITableView, cellForRowAtIndexPath > indexPath: NSIndexPath) -> UITableViewCell { > let cell = tableView.dequeueReusableCellWithIdentifier("resultCell", > forIndexPath: indexPath) as! ExistingLocationTableViewCell > let item = locationList[indexPath.row] > > cell.nameLabel.text = item.location.name > cell.locationLabel.text = item.location.address > > cell.accessoryType = item.selected ? .Checkmark : .None > > return cell > } > > One note: on iOS, the convention for table views is that rows should > generally not remain selected after the user lifts their finger. Adding the > checkmark should be enough to show a cell's selection state. I would only set > the checkmark and leave `cell.selected` as is (I left it out in the code > above). > > 2. In `didSelectRow...`, toggle the selection state in your model data: > > override func tableView(tableView: UITableView, didSelectRowAtIndexPath > indexPath: NSIndexPath) { > > // Update model > let row = indexPath.row > locationList[row].selected = !locationList[row].selected > > To update the UI, you now have two choices. Either ask the table view for the > cell at the index path and modify the cell directly: > > // Either do this: > if let cell = tableView.cellForRowAtIndexPath(indexPath) { > cell.accessoryType = locationList[row].selected ? .Checkmark : > .None > } > > If you do that, I don't think you need to reload the cell explicitly. > Alternatively, tell the table view to reload the cell as you are doing now. > It will then call `tableView(_:cellForRowAtIndexPath:)` again, which in turn > will configure the cell with your model data: > > // Or this: > tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .None) > > Finally, fade out the cell selection: > > tableView.deselectRowAtIndexPath(indexPath, animated: true) > } > > 3. If you are okay with keeping the cells deselected unless the user's finger > is onscreen, you don't need to implement `didDeselectRow...` at all. > > (I typed this mostly without help from the compiler as I don't have a Swift > 2.x handy, so there may be some errors in the code above.) > > Ole _______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users