为什么UITableViewCell会保持突出显示?

时间:2009-12-03 15:26:07

标签: ios uitableview cocoa-touch

触摸后会导致表格视图单元格保持突出显示的原因是什么?我点击单元格,可以看到它在按下详细视图时保持高亮显示。弹出详细信息视图后,单元格仍会突出显示。

18 个答案:

答案 0 :(得分:251)

didSelectRowAtIndexPath中,您需要致电deselectRowAtIndexPath取消选中此单元格。

所以无论你在didSelectRowAtIndexPath做了什么,你也可以打电话给deselectRowAtIndexPath

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
 // Do some stuff when the row is selected
 [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

答案 1 :(得分:57)

最干净的方法是在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)
    }
}

答案 2 :(得分:20)

你是否将-(void)viewWillAppear:(BOOL)animated分类?当您未在自定义方法中调用[super viewWillAppear:animated];时,所选的UITableViewCell将不会取消选择。

答案 3 :(得分:17)

对于Swift用户,请将其添加到您的代码中:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
}

除了Swift而不是Obj-C之外,这是paulthenerd的答案。

答案 4 :(得分:9)

Swift 3解决方案

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

答案 5 :(得分:7)

如果您使用的是UITableViewCell,请注释以下行

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{

 // [super setSelected:selected animated:animated];

}

希望这有帮助。

答案 6 :(得分:3)

要获得Kendall Helmstetter Gelner在他的评论中描述的行为,您可能不希望deselectRowAtIndexPath而是控制器上的clearsSelectionOnViewWillAppear属性。也许这是偶然设置为YES?

请参阅默认Apple模板中的注释以获取新的UITableViewController子类:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;
}

答案 7 :(得分:3)

更新了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

答案 8 :(得分:2)

我的钻取应用程序也遇到了这个问题。在视图控制器(我将其称为VC)之后,在推送另一个ViewController之后返回,VC中的所选单元格仍然突出显示。在我的应用程序中,我创建了VC来处理我的深入分析的第二级(三级)。

我的问题是VC是一个UIViewController(包含一个包含TableView的View)。我改为使VC成为一个UITableViewController(包含一个TableView)。从推送返回后,UITableViewController类自动处理表格单元格的去突出显示。帖子“Issue with deselectRowAtIndexPath in tableView”的第二个答案为这个问题提供了更完整的答案。

根视图控制器没有出现问题,因为当我在XCode中将应用程序创建为“基于导航的应用程序”时,生成的根视图控制器已经被创建为子类UITableViewController。

答案 9 :(得分:1)

Swift 5解决方案:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.deselectRow(at: indexPath as IndexPath, animated: true)
}

答案 10 :(得分:1)

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

答案 11 :(得分:1)

我正在使用CoreData,因此适用于我的代码是Swift中各种答案的想法组合:

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

答案 12 :(得分:1)

如果这些都不适合您,请考虑这种解决方法:

使用展开segue来调用:

@IBAction func unwind_ToTableVC (segue: UIStoryboardSegue) {
    if let index = tableView.indexPathForSelectedRow {
        tableView.deselectRowAtIndexPath(index, animated: true)
    }
}

为什么这样?主要是如果您在取消选择代码以便在正确的时间运行时遇到问题。我无法解决它在viewWillAppear上工作的问题,因此展开效果要好得多。

步骤:

  1. 将展开segue(或从上面粘贴)写入您的第一个VC(带表格的那个)
  2. 转到第二个VC。按住你正在使用的取消/完成/等按钮的控制 - 拖动来关闭该VC并拖动到顶部的退出图标。
  3. 选择您在步骤1中创建的展开segue

    祝你好运。

答案 13 :(得分:0)

对于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
}

答案 14 :(得分:0)

在UITableViewCell类中使用此方法

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {

   // Just comment This line of code
   // [super setSelected:selected animated:animated];        
}

答案 15 :(得分:0)

如果该单元格在触摸后仍保持突出显示,则可以调用UITabelView方法,

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

`[tableView deselectRowAtIndexPath:indexPath animated:YES];`   

}

或者,您可以使用以下方法并根据需要对其进行修改,

//标记: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()
  }
} 

答案 16 :(得分:0)

Xcode 10,Swift 4

我遇到了同样的问题,发现我在tableViewController的底部留下了一个空的对viewWillAppear的调用。一旦我删除了空的覆盖功能,该行就不再在返回tableView视图时突出显示。

问题功能

override func viewWillAppear(_ animated: Bool) {
  // need to remove this function if not being used.
}

删除空函数解决了我的问题。

答案 17 :(得分:0)

我长期以来一直遇到同样的问题,以防万一其他人在苦苦挣扎:

查看您的-tableView: cellForRowAtIndexPath:,看看您是在创建单元格还是使用'重用标识符'。如果是后者,请确保IB中的表具有带该标识符的单元格。如果您没有使用重用标识符,只需为每一行创建一个新单元格。

然后,这应该为您的表格显示出现的预期'淡入选定行'。