如何取消select一个选定的UITableView单元格?
我正在做一个项目,我必须预先select一个特定的单元格。
我可以使用-willDisplayCell
预选一个单元格,但当用户单击任何其他单元格时,我-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]) { [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 }