2017-01-10 9 views
0

Когда я выбираю строку таблицы и нажимаю 'Ok' под вкладкой city, она выделяет строку, но когда я меняю вкладку на town, она выделяет ту же строку на вкладке town, хотя я ее не выбрал. Это если Я выделяю второй и третий строки под вкладкой city, она выделяет второй и третий строки под вкладкой town, а я ничего не делаю. Ниже мой кодКак предотвратить выделение строки таблицы в следующем сегменте?

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{ 
    let myCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CityCell 
    switch (segCtrl.selectedSegmentIndex) 
    { 
    case 0: 
     myCell.myLabel.text = cityName[indexPath.row] 
     break 
    case 1: 
     myCell.myLabel.text = townName[indexPath.row] 
     break 
    default:break 
    } 
    return myCell 
} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){ 

let cell = tableView.cellForRow(at: indexPath)! 
let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .alert) 

let ok = UIAlertAction(title: "Ok", style: .default, handler: { (action) -> Void in 
    let cell = tableView.cellForRow(at: indexPath)! 
    cell.backgroundColor = UIColor(white: 1.0, alpha:0.5) 
    }) 
let cancel = UIAlertAction(title: "Cancel", style: .cancel, handler: { (action) -> Void in 
}) 
    alertController.addAction(ok) 
    alertController.addAction(cancel) 
present(alertController, animated: true, completion: nil) 
} 

Как предотвратить это выделение происходило в следующей вкладке и ограничить его, где я на самом деле выбрал строку?

ответ

1

Я работаю с объективом-c. Поэтому, извините, если мой быстрый код ошибочен.

// global variable which carry selection-indexPath 
var citySelectedIndexPaths = [IndexPath]() 
var townSelectedIndexPaths = [IndexPath]() 

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{ 
    let myCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CityCell 

    // add this line 
    myCell.backgroundColor = UIColor(white: 1.0, alpha:1.0) // default color 

    switch (segCtrl.selectedSegmentIndex) 
    { 
    case 0: 
     myCell.myLabel.text = cityName[indexPath.row] 
     if citySelectedIndexPaths.contains(indexPath) { 
      myCell.backgroundColor = UIColor(white: 1.0, alpha:0.5) 
     } 
     break 
    case 1: 
     myCell.myLabel.text = townName[indexPath.row] 
     if townSelectedIndexPaths.contains(indexPath) { 
      myCell.backgroundColor = UIColor(white: 1.0, alpha:0.5) 
     } 
     break 
    default:break 
    } 
    return myCell 
} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){ 

let cell = tableView.cellForRow(at: indexPath)! 
let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .alert) 

let ok = UIAlertAction(title: "Ok", style: .default, handler: { (action) -> Void in 
    let cell = tableView.cellForRow(at: indexPath)! 
    cell.backgroundColor = UIColor(white: 1.0, alpha:0.5) 

    // save selection indexPath 
    switch (segCtrl.selectedSegmentIndex) 
    { 
    case 0: 
     if citySelectedIndexPaths.contains(indexPath) { 
      let indexValue = citySelectedIndexPaths.indexOf(indexPath) 
      citySelectedIndexPaths.removeAtIndex(indexValue) 
     } else { 
      citySelectedIndexPaths.append(indexPath); 
     } 
     break 
    case 1: 
     if townSelectedIndexPaths.contains(indexPath) { 
      let indexValue = townSelectedIndexPaths.indexOf(indexPath) 
      townSelectedIndexPaths.removeAtIndex(indexValue) 
     } else { 
      townSelectedIndexPaths.append(indexPath); 
     } 
     break 
    default:break 
    } 

    }) 
let cancel = UIAlertAction(title: "Cancel", style: .cancel, handler: { (action) -> Void in 
}) 
    alertController.addAction(ok) 
    alertController.addAction(cancel) 
present(alertController, animated: true, completion: nil) 
} 
+0

Это не сохраняет выбор, когда я возвращаюсь. – leaner122

+0

Да, он просто перезагружает ячейку, когда вы меняете вкладку. Если вы хотите сохранить выбор, вы должны сохранить выделение indexPath.row в массиве или глобальной переменной при нажатии «ОК». затем используйте оператор if, чтобы определить ячейку, которая должна быть выделена в инструкции switch. – Hezron

+0

Это работает, но он запоминает только последнюю выбранную строку. То есть, если я выберу три строки, он выделяет только последнюю выбранную строку, а оставшиеся две строки не выбираются. – leaner122

0

Теперь в вашем коде вы устанавливаете фон вручную.

cell.backgroundColor = UIColor(white: 1.0, alpha:0.5) 

Но вы не сбросить cell.backgroundColor после выбора другой ячейки. Поэтому вам нужно сохранить текущий выбранный cell's indexPath и позвонить reloadData каждый раз, когда вы выбираете новую ячейку в ok UIAlertAction. В cellForRowAtIndexPath просто выполните ячейку с выбранной или невыделенной сценой.