[ios] UITableViewCell이 계속 강조 표시되는 이유는 무엇입니까?

터치 후 테이블 뷰 셀이 강조 표시되는 원인은 무엇입니까? 셀을 클릭하면 상세보기를 누를 때 강조 표시된 상태를 볼 수 있습니다. 디테일 뷰가 팝업되면 셀이 여전히 강조 표시됩니다.



답변

당신은 didSelectRowAtIndexPath당신 deselectRowAtIndexPath이 셀을 선택 취소 전화해야합니다 .

그래서 당신이하고있는 다른 일은 didSelectRowAtIndexPath그냥 전화하십시오 deselectRowAtIndexPath.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
 // Do some stuff when the row is selected
 [tableView deselectRowAtIndexPath:indexPath animated:YES];
}


답변

가장 깨끗한 방법은 viewWillAppear에 있습니다.

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    // Unselect the selected row if any
    NSIndexPath*    selection = [self.tableView indexPathForSelectedRow];
    if (selection) {
        [self.tableView deselectRowAtIndexPath:selection animated:YES];
    }
}

이런 식으로 컨트롤러로 돌아갈 때 선택을 페이드 아웃하는 애니메이션이 있어야합니다.

http://forums.macrumors.com/showthread.php?t=577677 에서 가져온

스위프트 버전

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    // deselect the selected row if any
    let selectedRow: IndexPath? = tableView.indexPathForSelectedRow
    if let selectedRowNotNill = selectedRow {
        tableView.deselectRow(at: selectedRowNotNill, animated: true)
    }
}


답변

서브 클래스 했습니까 -(void)viewWillAppear:(BOOL)animated? [super viewWillAppear:animated];사용자 정의 메소드를 호출하지 않으면 선택한 UITableViewCell이 선택 취소되지 않습니다 .


답변

Swift 사용자의 경우이를 코드에 추가하십시오.

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
}

Obj-C 대신 Swift를 제외하고는 paulthenerd의 대답입니다.


답변

스위프트 3 솔루션

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
      tableView.deselectRow(at: indexPath as IndexPath, animated: true)
}


답변

UITableViewCell을 사용하는 경우 다음 줄을 주석으로 처리하십시오.

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{

 // [super setSelected:selected animated:animated];

}

도움이 되었기를 바랍니다.


답변

스위프트 4로 업데이트

이전 답변을 기반으로 한 몇 가지 실험을 거친 후 두 가지 방법으로 최상의 행동을 얻을 수 있다는 결론을 얻었습니다. (실제로 거의 동일)

// First Solution: delegate of the table View
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: false)
}

// Second Solution: With the life cycle of the view.
override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)

    let selectedRow: IndexPath? = tableView.indexPathForSelectedRow
    if let selectedRow = selectedRow {
        tableView.deselectRow(at: selectedRow, animated: false)
    }
}

나는 더 간결하기 때문에 개인적으로 첫 번째 솔루션을 채택하고 있습니다. tableView로 돌아갈 때 약간의 애니메이션이 필요한 경우 또 다른 가능성은 다음을 사용하는 것입니다 viewWillAppear.

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    let selectedRow: IndexPath? = _view.tableView.indexPathForSelectedRow
    if let selectedRow = selectedRow {
        _view.tableView.deselectRow(at: selectedRow, animated: true)
    }
}

마지막으로 UITableViewController를 사용하는 경우 clearsSelectionOnViewWillAppear 속성을 활용할 수도 있습니다 .