如何取消select一个选定的UITableView单元格?

我正在做一个项目,我必须预先select一个特定的单元格。

我可以使用-willDisplayCell预选一个单元格,但当用户单击任何其他单元格时,我-willDisplayCellselect它。

 - (void)tableView:(UITableView*)tableView willDisplayCell:(UITableViewCell*)cell forRowAtIndexPath:(NSIndexPath*)indexPath { AppDelegate_iPad *appDelegte = (AppDelegate_iPad *)[[UIApplication sharedApplication] delegate]; if ([appDelegte.indexPathDelegate row] == [indexPath row]) { [cell setSelected:YES]; } } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { AppDelegate_iPad *appDelegte = (AppDelegate_iPad *)[[UIApplication sharedApplication] delegate]; NSIndexPath *indexpath1 = appDelegte.indexPathDelegate; appDelegte.indexPathDelegate = indexPath; [materialTable deselectRowAtIndexPath:indexpath1 animated:NO]; } 

你能帮我吗?

使用这个代码

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { //Change the selected background view of the cell. [tableView deselectRowAtIndexPath:indexPath animated:YES]; } 

Swift 3.0:

 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { //Change the selected background view of the cell. tableView.deselectRow(at: indexPath, animated: true) } 

在表视图中使用以下方法委托的didSelectRowAtIndexpath (或从任何地方)

 [myTable deselectRowAtIndexPath:[myTable indexPathForSelectedRow] animated:YES]; 

尝试这个:

 for (NSIndexPath *indexPath in tableView.indexPathsForSelectedRows) { [tableView deselectRowAtIndexPath:indexPath animated:NO]; } 

请检查委托方法是否正确。 例如;

 -(void) tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath 

对于

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

迅速:

 tableView.deselectRowAtIndexPath(indexPath, animated: true) 

除了将单元格设置为选中状态之外,还需要通知tableView单元格已被选中。 将一个调用添加到-tableView:selectRowAtIndexPath:animated:scrollPosition:到您的willDisplayCell:方法中:您将能够正常取消select它。

 - (void)tableView:(UITableView*)tableView willDisplayCell:(UITableViewCell*)cell forRowAtIndexPath:(NSIndexPath*)indexPath { AppDelegate_iPad *appDelegte = (AppDelegate_iPad *)[[UIApplication sharedApplication] delegate]; if ([appDelegte.indexPathDelegate row] == [indexPath row]) { // SELECT CELL [cell setSelected:YES]; // TELL TABLEVIEW THAT ROW IS SELECTED [tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; } } 

一定要使用UITableViewScrollPositionNone来避免奇怪的滚动行为。

在Swift中为此做一个扩展可能是有用的。

Swift 3:

Swift扩展(例如在UITableViewExtension.swift文件中):

 import UIKit extension UITableView { public func deselectSelectedRow(animated: Bool) { if let indexPathForSelectedRow = self.indexPathForSelectedRow { self.deselectRow(at: indexPathForSelectedRow, animated: animated) } } } 

使用例如:

 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.tableView.deselectSelectedRow(animated: true) } 

这应该工作:

 [tableView deselectRowAtIndexPath:indexpath1 animated:NO]; 

只要确保materialTable和tableView指向同一个对象。

材料是否连接到Interface Builder中的tableView?

基于saikirans解决scheme,我写了这个,这帮助了我。 在.m文件上:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if(selectedRowIndex && indexPath.row == selectedRowIndex.row) { [tableView deselectRowAtIndexPath:indexPath animated:YES]; selectedRowIndex = nil; } else { self.selectedRowIndex = [indexPath retain]; } [tableView beginUpdates]; [tableView endUpdates]; } 

并在头文件中:

 @property (retain, nonatomic) NSIndexPath* selectedRowIndex; 

我也不是很有经验,所以仔细检查内存泄漏等。

如果你想要select任何表格单元格的第一次点击和取消select第二,你应该使用这个代码:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (self.selectedIndexPath && [indexPath compare:self.selectedIndexPath] == NSOrderedSame) { [tableView deselectRowAtIndexPath:indexPath animated:YES]; self.selectedIndexPath = nil; } else { self.selectedIndexPath = indexPath; } } 

Swift 2.0:

 tableView.deselectRowAtIndexPath(indexPath, animated: true) 

Swift 4:

 func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? { let cell = tableView.cellForRow(at: indexPath) if cell?.isSelected == true { // check if cell has been previously selected tableView.deselectRow(at: indexPath, animated: true) return nil } else { return indexPath } } 

尝试这个

 [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES]; 
 NSIndexPath * index = [self.menuTableView indexPathForSelectedRow]; [self.menuTableView deselectRowAtIndexPath:index animated:NO]; 

根据您的代码放置此代码,您将取消您的单元格。

你能试试吗?

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { AppDelegate_iPad *appDelegte = (AppDelegate_iPad *)[[UIApplication sharedApplication] delegate]; NSIndexPath *indexpath1 = appDelegte.indexPathDelegate; appDelegte.indexPathDelegate = indexPath; UITableViewCell *prevSelectedCell = [tableView cellForRowAtIndexPath: indexpath1]; if([prevSelectedCell isSelected]){ [prevSelectedCell setSelected:NO]; } } 

它为我工作。

Swift 3.0:

遵循ray wenderlich swift样式指南的协议一致性部分 ,为了保持相关的方法组合在一起,把这个扩展名放在你的视图控制器类下面:

 // your view controller class MyViewcontroller: UIViewController { // class stuff here } // MARK: - UITableViewDelegate extension MyViewcontroller: UITableViewDelegate { // use the UITableViewDelegate method tableView(_:didSelectRowAt:) func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { // your code when user select row at indexPath // at the end use deselectRow tableView.deselectRow(at: indexPath, animated: true) } } 

迅速

 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { // your code // your code // and use deselect row to end line of this function self.tableView.deselectRowAtIndexPath(indexPath, animated: true) } 
 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) } 

Swift 3

我也遇到过这种情况 – 当你浏览或者放松回到表视图时,它通常不会为你select以前select的行。 我把这个代码放在表格视图控制器中,效果很好:

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

迅速3.0

  tableView.deselectRow(at: indexPath, animated: true) 

由于预加载的数据,第一次点击时要取消select(DidDeselectRowAt); 你需要通知tableView该行已经被select,以便初始点击然后取消select该行:

// Swift 3:

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { if tableView[indexPath.row] == "data value" tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableViewScrollPosition.none) } } 

Swift 3/4

在ViewController中:

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

在自定义单元中:

 override func awakeFromNib() { super.awakeFromNib() selectionStyle = .none }