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


145

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

답변:


262

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

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

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

11
deselectRowAtIndexPath행을 선택하면 새보기가 표시되면 viewDidAppear에서를 호출하는 것이 좋습니다.
notnoop

5
실제로 그것은 전화하기에 적합한 장소가 아닙니다. 실제로 ... 테이블이있는 Apple 앱을 사용해보십시오 (연락처는 좋은 것입니다). 새 화면으로 푸시하면 셀이 여전히 강조 표시됩니다. 선택을 해제하기 전에 잠깐 동안. 이론적으로 난 당신이 viewDidAppear 코드가 필요하지 않아야 그래서, 바로 그 자체 해제해야하는 추가 작업을 할 필요가 없습니다 생각 ...
켄달 Helmstetter Gelner

6
@Kendall, @ 4thSpace : 어쩌면 내가 언급 한 사람에 대해 마지막으로 언급 한 내용이 혼란 스러웠을 수도 있습니다. UITableViewController -deselectRowAtIndexPath:animated:는 tableView 속성 의 메소드를에서 호출합니다 -viewDidAppear. 당신이 UIViewController 하위에있는 테이블 뷰가있는 경우 그러나, 당신은 호출해야합니다 -deselectRowAtIndexPath:animated:에서 -viewDidAppear자신. :)
Daniel Tull

5
UITableViewController의 하위 클래스에서 실제로는 그것을 무시한 -viewWillAppear:것입니다. 통화를 추가하면 [super viewWillAppear:animated]다시 작동합니다.
벤 도전자

5
3.2 이후로 UITableViewControllerclearsSelectionOnViewWillAppear속성이 YES(기본값)으로 설정되어 있고 [super viewWillAppear]호출이 금지되지 않은 경우 자동 선택 취소 동작이 발생합니다 .
조각 모음

62

가장 깨끗한 방법은 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)
    }
}

1
이것은 UITableViewController를 사용하지 않으면 대부분의 사람들이 원할 것으로 예상되는 것입니다. +1
MikeB

3
iOS 7을 사용하여 사용자가 '끌어 넘길'수있게되면서 사람들이 지금하고있는 일이 궁금합니다. 동작을 부분적으로 드래그 한 다음 완료하지 않으면 viewWillAppear가 실행됩니다. 사용자가 실수로 돌아 오면 행이 선택되지 않습니다.
벤 패커드

1
@ BenPackard는 viewDidAppear대신 대신 호출합니다 .
squarefrog

@Jessica indexPathForSelectedRow호출은 nil을 반환 할 수 있으므로 확인해야합니다. 설명서 상태 : 선택한 행의 행 및 섹션 인덱스를 식별하는 인덱스 경로 또는 인덱스 경로가 유효하지 않은 경우 nil.
Gordonium

이 사용자가 다시 👌, 완벽한 얻기 후에 선택을 도달 할 수 있도록 좀 더 UI가 친절, 허용 대답으로 발언해야
야야 Alshaar

20

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


19

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

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

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


1
자체적으로 선택 해제되지 않습니까, 당신이 놓은 순간을 의미합니까?
Honey

@Honey 아마도 이전 버전의 iOS에서 또는보기가 사라 졌을지라도 iOS 10 (아마도 이전 버전) 이상에서는 그렇지 않습니다.
Jamie Birch

9

스위프트 3 솔루션

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

7

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

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

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

}

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


4

스위프트 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 속성을 활용할 수도 있습니다 .


3

Kendall Helmstetter Gelner가 자신의 의견에서 설명하는 동작을 얻으려면 deselectRowAtIndexPath가 아니라 컨트롤러의 clearsSelectionOnViewWillAppear 속성을 원할 것입니다. 우연히 이것이 YES로 설정 되었습니까?

새로운 UITableViewController 서브 클래스에 대해서는 기본 Apple 템플리트의 주석을 참조하십시오.

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;
}

2

드릴 다운 응용 프로그램 에서도이 문제가 발생했습니다. VC라고 부르는 viewcontroller가 다른 ViewController를 누른 후 돌아온 후에 VC에서 선택한 셀이 강조 표시되어 있습니다. 내 응용 프로그램에서 드릴 다운의 두 번째 수준 (3 수준 중)을 처리하기 위해 VC를 만들었습니다.

필자의 경우 VC는 UIViewController (TableView가 포함 된 View가 포함되어 있음)였습니다. 대신 VC를 UITableViewController (TableView 포함)로 만들었습니다. UITableViewController 클래스는 푸시에서 돌아온 후 테이블 셀의 강조 표시 해제를 자동으로 처리합니다. " tableView의 deselectRowAtIndexPath 관련 문제 "게시물에 대한 두 번째 답변 은이 문제에 대한보다 완전한 답변을 제공합니다.

XCode에서 앱을 "탐색 기반 앱"으로 만들 때 결과 루트 뷰 컨트롤러가 이미 UITableViewController 하위 클래스로 만들어 졌기 때문에 루트 뷰 컨트롤러에 문제가 발생하지 않았습니다.


1

위의 방법으로도 문제가 해결되지 않으면 다음 해결 방법을 고려하십시오.

풀기 segue를 사용하여 다음을 호출하십시오.

@IBAction func unwind_ToTableVC (segue: UIStoryboardSegue) {
    if let index = tableView.indexPathForSelectedRow {
        tableView.deselectRowAtIndexPath(index, animated: true)
    }
}

왜 이렇게합니까? 기본적으로 선택 해제 코드를 적시에 실행하는 데 문제가있는 경우 viewWillAppear에서 작동하지 않는 데 문제가있어서 풀기가 훨씬 잘 작동했습니다.

단계 :

  1. 풀기 segue (또는 위에서 붙여 넣기)를 첫 번째 VC (테이블이있는 VC)에 씁니다.

  2. 2 차 VC로 이동하십시오. 사용중인 취소 / 완료 / 기타 버튼을 Control- 드래그하여 해당 VC를 닫고 상단의 종료 아이콘으로 드래그하십시오.

  3. 1 단계에서 생성 한 풀기 segue를 선택하십시오.

    행운을 빕니다.


이것은 viewDidAppear가 실행되지 않는 시간에 가장 적합한 솔루션입니다 (예 : 자식보기가 양식 시트로 모달 표시되고 전체 화면을 다루지 않는 경우).
pheedsta

1

나는 CoreData를 사용하고있어서 나를 위해 일한 코드는 Swift에서 다양한 답변의 아이디어 조합이었습니다.

override func viewDidAppear(_ animated: Bool) {
    if let testSelected = yourTable.indexPathForSelectedRow {
        yourTable.deselectRow(at: testSelected, animated: true)
    }
    super.viewDidAppear(true)
}

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

0

다른 사람이 어려움을 겪고있는 경우를 대비하여 오랫동안 같은 문제가 발생했습니다.

당신의 한 번 봐 -tableView: cellForRowAtIndexPath:당신이 세포를 만들거나 '재사용 식별자'를 사용하는 경우를 참조하십시오. 후자의 경우 IB의 테이블에 해당 식별자가있는 셀이 있는지 확인하십시오. 재사용 식별자를 사용하지 않는 경우 각 행에 대해 새 셀을 작성하십시오.

그러면 표에 예상 '페이드 선택된 행'이 나타납니다.


0

UITableViewCell 클래스에서이 메소드를 사용하십시오.

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

   // Just comment This line of code
   // [super setSelected:selected animated:animated];        
}

0

스위프트 3 : viewDidDisappear에서 사용하는 것이 좋습니다.

밝히다:-

    var selectedIndexPath = IndexPath()

viewDidDisappear에서 :-

    override func viewDidDisappear(_ animated: Bool) {
    yourTableView.deselectRow(at: selectedIndexPath, animated: true)
}

didSelectRowAtIndexPath에서 :-

    func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath) {
    selectedIndexPath = indexPath
}

0

셀을 터치 한 후 강조 표시된 상태로 유지되면 UITabelView 메소드를 호출 할 수 있습니다.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

`[tableView deselectRowAtIndexPath:indexPath animated:YES];`   

}

또는 다음 방법을 사용하여 요구 사항에 따라 수정할 수 있습니다.

// MARK : UITableViewDelegate

func tableView(tableView: UITableView, didHighlightRowAtIndexPath indexPath: NSIndexPath) {
  if let cell = tableView.cellForRowAtIndexPath(indexPath) {
     cell.backgroundColor = UIColor.greenColor()
  }
}

func tableView(tableView: UITableView, didUnhighlightRowAtIndexPath indexPath: NSIndexPath) {
  if let cell = tableView.cellForRowAtIndexPath(indexPath) {
     cell.backgroundColor = UIColor.blackColor()
  }
} 

0

Xcode 10, 스위프트 4

나는이 같은 문제가 있었고 tableViewController의 맨 아래에 viewWillAppear에 대한 빈 호출을 남겼 음을 발견했다. 빈 재정의 기능을 제거한 후에는 tableView 뷰로 돌아갈 때 행이 더 이상 강조 표시되지 않습니다.

문제 기능

override func viewWillAppear(_ animated: Bool) {
  // need to remove this function if not being used.
}

빈 기능을 제거하면 내 문제가 해결되었습니다.


0

스위프트 5 솔루션 :

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.deselectRow(at: indexPath as IndexPath, animated: true)
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.