2017-01-10 6 views
0

테이블 행을 선택하고 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

저는 objective-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

이것은 작동하지만 선택된 마지막 행만 기억합니다. 즉, 3 개의 행을 선택하면 마지막으로 선택한 행만 강조 표시되고 나머지 두 개의 행은 선택 취소됩니다. – leaner122

0

이제 코드에서 배경을 수동으로 설정했습니다.

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

그러나 다른 셀을 선택하면 cell.backgroundColor을 재설정하지 않았습니다. 그러므로 현재 선택한 셀을 cell's indexPath에 저장하고 에서 새 셀을 선택할 때마다 reloadData으로 호출해야합니다. cellForRowAtIndexPath에서 선택되거나 선택되지 않은 단계로 셀을 수행하십시오.