我正在做一个项目,我必须预先选择一个特定的单元格。
我可以使用-willDisplayCell预选择一个单元格,但是当用户单击任何其他单元格时,我不能取消选择它。
- (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];
}
你能帮忙吗?
基于saikirans的解决方案,我写了这个,这对我有帮助。在.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;
我也不是很有经验,所以双重检查内存泄漏等。
除了设置选定的单元格外,还需要通知tableView单元格已被选中。添加一个调用-tableView:selectRowAtIndexPath:animated:scrollPosition:到你的willDisplayCell: method:,你将能够像平常一样取消选择它。
- (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 4和Swift 5:
Swift扩展(例如在UITableViewExtension.swift文件中):
import UIKit
extension UITableView {
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)
}
这是Swift 4的解决方案
in tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
只需添加
tableView.deselectRow(at: indexPath, animated: true)
这招很管用
例子:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
//some code
}