답변:
당신은 didSelectRowAtIndexPath
당신 deselectRowAtIndexPath
이 셀을 선택 취소 전화해야합니다 .
그래서 당신이하고있는 다른 일은 didSelectRowAtIndexPath
그냥 전화하십시오 deselectRowAtIndexPath
.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Do some stuff when the row is selected
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
-deselectRowAtIndexPath:animated:
는 tableView 속성 의 메소드를에서 호출합니다 -viewDidAppear
. 당신이 UIViewController 하위에있는 테이블 뷰가있는 경우 그러나, 당신은 호출해야합니다 -deselectRowAtIndexPath:animated:
에서 -viewDidAppear
자신. :)
-viewWillAppear:
것입니다. 통화를 추가하면 [super viewWillAppear:animated]
다시 작동합니다.
UITableViewController
의 clearsSelectionOnViewWillAppear
속성이 YES
(기본값)으로 설정되어 있고 [super viewWillAppear]
호출이 금지되지 않은 경우 자동 선택 취소 동작이 발생합니다 .
가장 깨끗한 방법은 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)
}
}
viewDidAppear
대신 대신 호출합니다 .
서브 클래스 했습니까 -(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의 대답입니다.
스위프트 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 속성을 활용할 수도 있습니다 .
Kendall Helmstetter Gelner가 자신의 의견에서 설명하는 동작을 얻으려면 deselectRowAtIndexPath가 아니라 컨트롤러의 clearsSelectionOnViewWillAppear 속성을 원할 것입니다. 우연히 이것이 YES로 설정 되었습니까?
새로운 UITableViewController 서브 클래스에 대해서는 기본 Apple 템플리트의 주석을 참조하십시오.
- (void)viewDidLoad
{
[super viewDidLoad];
// Uncomment the following line to preserve selection between presentations.
// self.clearsSelectionOnViewWillAppear = NO;
}
드릴 다운 응용 프로그램 에서도이 문제가 발생했습니다. VC라고 부르는 viewcontroller가 다른 ViewController를 누른 후 돌아온 후에 VC에서 선택한 셀이 강조 표시되어 있습니다. 내 응용 프로그램에서 드릴 다운의 두 번째 수준 (3 수준 중)을 처리하기 위해 VC를 만들었습니다.
필자의 경우 VC는 UIViewController (TableView가 포함 된 View가 포함되어 있음)였습니다. 대신 VC를 UITableViewController (TableView 포함)로 만들었습니다. UITableViewController 클래스는 푸시에서 돌아온 후 테이블 셀의 강조 표시 해제를 자동으로 처리합니다. " tableView의 deselectRowAtIndexPath 관련 문제 "게시물에 대한 두 번째 답변 은이 문제에 대한보다 완전한 답변을 제공합니다.
XCode에서 앱을 "탐색 기반 앱"으로 만들 때 결과 루트 뷰 컨트롤러가 이미 UITableViewController 하위 클래스로 만들어 졌기 때문에 루트 뷰 컨트롤러에 문제가 발생하지 않았습니다.
위의 방법으로도 문제가 해결되지 않으면 다음 해결 방법을 고려하십시오.
풀기 segue를 사용하여 다음을 호출하십시오.
@IBAction func unwind_ToTableVC (segue: UIStoryboardSegue) {
if let index = tableView.indexPathForSelectedRow {
tableView.deselectRowAtIndexPath(index, animated: true)
}
}
왜 이렇게합니까? 기본적으로 선택 해제 코드를 적시에 실행하는 데 문제가있는 경우 viewWillAppear에서 작동하지 않는 데 문제가있어서 풀기가 훨씬 잘 작동했습니다.
단계 :
풀기 segue (또는 위에서 붙여 넣기)를 첫 번째 VC (테이블이있는 VC)에 씁니다.
2 차 VC로 이동하십시오. 사용중인 취소 / 완료 / 기타 버튼을 Control- 드래그하여 해당 VC를 닫고 상단의 종료 아이콘으로 드래그하십시오.
1 단계에서 생성 한 풀기 segue를 선택하십시오.
행운을 빕니다.
다른 사람이 어려움을 겪고있는 경우를 대비하여 오랫동안 같은 문제가 발생했습니다.
당신의 한 번 봐 -tableView: cellForRowAtIndexPath:
당신이 세포를 만들거나 '재사용 식별자'를 사용하는 경우를 참조하십시오. 후자의 경우 IB의 테이블에 해당 식별자가있는 셀이 있는지 확인하십시오. 재사용 식별자를 사용하지 않는 경우 각 행에 대해 새 셀을 작성하십시오.
그러면 표에 예상 '페이드 선택된 행'이 나타납니다.
스위프트 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
}
셀을 터치 한 후 강조 표시된 상태로 유지되면 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()
}
}
deselectRowAtIndexPath
행을 선택하면 새보기가 표시되면 viewDidAppear에서를 호출하는 것이 좋습니다.