当我在用户 Select UITableView行后推送视图时,该行会显示一个蓝色高亮显示,然后会出现新视图.没关系.但当我回到"后面"时,这一行仍然以蓝色突出显示.这是我的didSelectRowAtIndexPath代码.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    SettingsViewController *controller = [[SettingsViewController alloc] initWithNibName:@"SettingsView" bundle:nil];
    [[self navigationController] pushViewController:controller animated:YES];
    [controller release], controller = nil; 
}

我做错了什么?

推荐答案

正如上面的答案所指出的,您需要显式取消 Select 该行.关于如何做到这一点,你有两个 Select .首先,在 Select 后立即取消 Select 行:

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

这将很好地工作,但有一种替代方法,它是UITableViewController所采取的方法,即保留选中的行,然后在视图重新出现时取消选中它(在您正在推的控制器从堆栈中弹出后).

这有一个微小的优势,当用户返回时,可以看到他们之前 Select 的内容,因此可以看到他们之前 Select 的内容.

要实现这一点,只需覆盖viewWillAppear:

- (void)viewWillAppear:(BOOL)animated
{
  [super viewWillAppear:animated];
  [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
}

正如我所说的,这是UITableViewController's viewWillAppear:的默认实现所做的.如果您使用UITableViewControllernot看到这种行为,您应该判断您是否在自己的类的viewDidAppear:中调用super实现.

Update (30 Oct 2013):嗯,这是一个流行的答案!正如Ben在 comments 中正确指出的那样,UtableViewController实际上是在viewWillAppear:而不是viewDidAppear:中完成的——这是正确的时机.此外,可以使用UITableViewController的clearsSelectionOnViewWillAppear属性打开和关闭此行为.为了反映这一点,我修改了上面的答案.

Objective-c相关问答推荐

在没有for循环的情况下获取另一个数组中每个对象的属性值数组

来自 NSDate 的日期名称?

使用 AVAudioplayer 在后台播放音乐

UITabBar 中的自定义 colored颜色

将类作为参数传递?

如何可靠地检测 iOS 9 上是否连接了外部键盘?

在 iOS8 上,以横向模式显示我的应用程序会隐藏状态栏,但在 iOS 7 上,状态栏会同时显示在两个方向上

多个(两个)持久存储可以与一个对象模型一起使用,同时保持一个到另一个的关系吗?

检测 NSString 的语言

为 iphone 应用程序设置自动构建服务器的最佳实践?

增加推送通知徽章 iPhone

如何从 Xcode4 生成 UML 图

iOS NSLayoutConstraint 使用 constraintWithItem 固定宽度

我可以设置 `UILabel` 的 `attributedText` 属性吗

如何删除手势识别器

当用户点击文本字段外的其他区域时如何关闭键盘?

代码问题:格式字符串不是字符串文字

NSMutableArray 按顺序添加对象

获取当前调度队列?

如何从 UIColor 对象中获取红绿蓝 (RGB) 和 alpha?