17

目前,我通过使用UITableViewSelectionStyleNone然后根据委托方法更改单元格的颜色来覆盖标准 UITableViewSelectionStyle:

- (void)tableView:(UITableView *)tableView 
      didHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];                
    [cell setBackgroundColor:[UIColor yellowColor]];
}

- (void)tableView:(UITableView *)tableView 
    didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    [cell setBackgroundColor:[UIColor whiteColor]];
}

- (void)tableView:(UITableView *)tableView 
    didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"indexpath: %i",indexPath.row);
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    [cell setBackgroundColor:[UIColor whiteColor]];
}

- (void)tableView:(UITableView *)tableView 
    didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    [cell setBackgroundColor:[UIColor whiteColor]];
}

这几乎可以工作,除了每当我突出显示一个单元格然后将我的手指拖离它而不实际选择它时,颜色不会变为白色......如果我将它设置为 [UIColor RedColor] 它可以完美地工作。为什么是这样...

编辑:

不知何故,当我在 didUnhlightRowAtIndexPath 之后打印出 indexPath.row 时,我从我的 NSLog 中得到“indexpath:2147483647”

4

8 回答 8

34

你可以试试:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
 [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

如果您只想在选择一个单元格后突出显示消失。除非我误解了你的问题。

于 2013-07-28T03:58:05.217 回答
22

你也可以试试这个

tableView.allowsSelection = NO;

另一种方法

cell.selectionStyle = UITableViewCellSelectionStyleNone;

多一个

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
于 2013-09-13T10:28:11.877 回答
6

您也可以从情节提要中执行此操作。选择 tableViewCell 并在 Attributes Inspector 下选择 Selection > None

在此处输入图像描述

于 2016-09-12T17:30:25.267 回答
3

这是一个Swift 2 版本

    if let indexPaths = self.tableView.indexPathsForSelectedRows {
        for indexPath in indexPaths {
            self.tableView.deselectRowAtIndexPath(indexPath, animated: true)
        }
    }
于 2015-08-20T08:36:49.227 回答
3

取消选择选定的行。你甚至不需要知道它是哪一个。

tableView.selectRow(at: nil, animated: true, scrollPosition: .none)
于 2018-03-22T09:13:39.760 回答
2

通过维护我的 indexPath 的本地实例,我能够找到最后选择的单元格并将其颜色更改为白色。我必须自己保持状态似乎真的很烦人,但事实就是如此......

于 2013-07-28T03:19:33.003 回答
0

对我有用的最简单的解决方案(Swift 4.2)
(如果您仍然希望表格视图的行是可选的)

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if let index = self.tableView.indexPathForSelectedRow{
        self.tableView.deselectRow(at: index, animated: true)
    }
}
于 2018-08-25T11:53:22.180 回答
0

用扩展来做这个怎么样?

import UIKit

extension UITableView {
    func removeRowSelections() {
        self.indexPathsForSelectedRows?.forEach {
            self.deselectRow(at: $0, animated: true)
        }
    }
}

用法:

tableView.removeRowSelections()
于 2019-10-06T08:48:51.430 回答