什么会导致表格视图单元格被触摸后保持高亮显示?我点击单元格,可以看到它在按下详细视图时保持高亮显示。弹出详细信息视图后,单元格仍会突出显示。
在你的didSelectRowAtIndexPath
中,你需要调用deselectRowAtIndexPath
取消选择单元格。
所以无论你在didSelectRowAtIndexPath
做什么,你只需要打电话给deselectRowAtIndexPath
。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Do some stuff when the row is selected
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
如果这些都不适合您,请考虑这种解决方法:
使用unwind segue来调用:
@IBAction func unwind_ToTableVC (segue: UIStoryboardSegue) {
if let index = tableView.indexPathForSelectedRow {
tableView.deselectRowAtIndexPath(index, animated: true)
}
}
为什么这样?主要是如果您在取消选择代码以便在正确的时间运行时遇到问题。我无法解决它在viewWillAppear上工作的问题,因此展开效果更好。
脚步:
我正在使用Core Data,因此对我有用的代码是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:我更喜欢在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
}
如果单元格在触摸后仍保持高亮显示,则可以调用TableView方法,
- (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()
}
}
Xcode 10,Swift 4
我遇到了同样的问题,并发现我在tableViewController底部的viewWillAppear中空了一个空调。一旦我删除了空覆盖功能,该行在返回tableView视图时不再保持高亮显示。
问题的功能
override func viewWillAppear(_ animated: Bool) {
// need to remove this function if not being used.
}
删除空函数解决了我的问题。
最干净的方法是在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
Swift版本
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)
}
}
你是否继承了-(void)viewWillAppear:(BOOL)animated
?如果不在自定义方法中调用[super viewWillAppear:animated];
,则不会取消选择所选的UITableViewCell。
对于Swift用户,请将其添加到您的代码中:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
除了Swift而不是Obj-C之外,这是paulthenerd的答案。
Swift 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)
}
}
我个人采用第一种解决方案,因为它更简洁。另一种可能性,如果你在返回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之后返回,VC中的所选单元格仍然突出显示。在我的应用程序中,我创建了VC以处理我的深入分析的第二级(三级)。
我的问题是VC是一个UIViewController(包含一个包含TableView的View)。我改为使VC成为一个UITableViewController(包含一个TableView)。从推送返回后,UITableViewController类自动处理表格单元格的去突出显示。帖子“Issue with deselectRowAtIndexPath in tableView”的第二个答案给出了一个更完整的答案。
根视图控制器没有出现这个问题,因为当我在XCode中将应用程序创建为“基于导航的应用程序”时,生成的根视图控制器已经被创建为子类UITableViewController。