programing

UITableViewCell이 강조 표시된 상태로 유지되는 이유는 무엇입니까?

kingscode 2023. 6. 10. 15:56
반응형

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];
}

가장 깨끗한 방법은 다음과 같이 표시됩니다.

- (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];
    }
}

이렇게 하면 컨트롤러로 돌아갈 때 선택 항목이 페이딩(fading)되는 애니메이션을 볼 수 있습니다.

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)
    }
}

Swift 사용자의 경우 코드에 다음을 추가합니다.

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

폴 너드의 대답이지만 Obj-C 대신 Swift에 있습니다.

당신은 서브클래스를 했습니까?-(void)viewWillAppear:(BOOL)animated때 한 UITableViewCell이 취소되지 [super viewWillAppear:animated];사용자 지정 방법으로.

스위프트 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];

}

이게 도움이 되길 바랍니다.

Swift 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)
    }
}

저는 개인적으로 첫 번째 해결책을 채택하고 있습니다. 왜냐하면 그것은 단순히 더 간결하기 때문입니다. 때 하다면, 테블로돌아때갈애필션경다다있수사습니용음할이을는우에요이한이니메를 하는 것입니다.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를 사용하는 경우 속성 지우기를 활용할 수도 있습니다.SelectionOnView가 나타납니다.

Kendall Helmstetter Gelner가 그의 댓글에서 설명한 동작을 얻으려면 RowAt 선택 취소를 원하지 않을 것입니다.IndexPath가 아닌 가 지워집니다.SelectionOnView 컨트롤러에 속성이 나타납니다.실수로 YES로 설정된 것이 아닐까요?

새 UITableViewController 하위 클래스에 대한 기본 Apple 템플릿의 설명을 참조하십시오.

- (void)viewDidLoad
{
    [super viewDidLoad];

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

Swift 5 솔루션:

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

드릴다운 애플리케이션에서도 이 문제가 발생했습니다.다른 ViewController를 푸시한 후 VC라고 하는 ViewController가 돌아온 후에도 VC에서 선택한 셀이 강조 표시된 상태로 남아 있습니다.앱에서 드릴다운의 두 번째 레벨(세 가지 레벨 중)을 처리할 VC를 만들었습니다.

제 경우 문제는 VC가 UIView 컨트롤러(TableView가 포함된 View 포함)였다는 것입니다.대신 VC를 UITableView 컨트롤러(TableView 포함)로 만들었습니다.UITableViewController 클래스는 푸시에서 돌아온 후 테이블 셀의 강조 표시 해제를 자동으로 처리합니다.게시물에 대한 두 번째 답변: "RowAt 선택 취소문제"tableView의 IndexPath"는 이 문제에 대한 보다 완전한 답변을 제공합니다.

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

이러한 문제가 해결되지 않는 경우 다음 해결 방법을 고려하십시오.

언윈드 세그를 사용하여 다음을 호출합니다.

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

왜 그럴까요?주로 적절한 시간에 실행할 선택 취소 코드를 얻는 데 문제가 있는 경우입니다.Will Appear 뷰에서 작동하지 않아 어려움을 겪었기 때문에 언윈드가 훨씬 더 잘 작동했습니다.

단계:

  1. 첫 번째 VC(테이블이 있는 VC)에 언윈드 세그(또는 위에서 붙여넣기)를 씁니다.

  2. 두 번째 VC로 이동합니다.해당 VC를 해제하는 데 사용하는 Cancel/Done/Etc 버튼에서 제어 끌어서 상단의 Exit(종료) 아이콘으로 끕니다.

  3. 1단계에서 생성한 해제된 세그먼트 선택

    행운을 빌어요.

저는 CoreData를 사용하고 있기 때문에 Swift에서 다양한 답변을 통해 얻은 아이디어를 조합하여 사용할 수 있었습니다.

override func viewDidAppear(_ animated: Bool) {
    if let testSelected = yourTable.indexPathForSelectedRow {
        yourTable.deselectRow(at: testSelected, animated: true)
    }
    super.viewDidAppear(true)
}
 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath as IndexPath, animated: true)
}

저는 오랫동안 같은 문제를 안고 있었기 때문에 다른 사람이 힘들어할 경우를 대비해 다음과 같이 말합니다.

다음 항목을 확인하십시오.-tableView: cellForRowAtIndexPath:셀을 작성하고 있는지, '셀 식별자'를 사용하고 있는지 확인합니다.후자의 경우 IB의 테이블에 해당 식별자를 가진 셀이 있는지 확인합니다.재사용 식별자를 사용하지 않는 경우 각 행에 대해 새 셀을 만듭니다.

그러면 테이블이 나타날 때 예상되는 '페이드 선택 행'이 표시됩니다.

UITableViewCell 클래스에서 이 메서드 사용

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

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

Swift 3의 경우: viewDidDisparen에서 사용했으면 합니다.

정의:-

    var selectedIndexPath = IndexPath()

ViewDidDisparen:-

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

Indid 행 선택 위치인덱스 경로:-

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

셀을 터치한 후에도 강조 표시된 상태로 남아 있는 경우 UITabelView 메서드를 호출할 수 있습니다.

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

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

}

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

MARK: UITableView 딜러

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()
  }
} 

Xcode 10, 스위프트 4

동일한 문제가 발생하여 테이블 하단에 WillAppear를 표시하는 빈 호출을 남겼습니다.빈 재정의 기능을 제거한 후 테이블 뷰로 돌아갈 때 행이 더 이상 강조 표시되지 않습니다.

문제 함수

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

빈 기능을 제거하여 문제를 해결했습니다.

언급URL : https://stackoverflow.com/questions/1840614/why-does-uitableviewcell-remain-highlighted

반응형