在reloadData之后保存UITableView中的选定行

vin*_*itu 32 iphone user-interface

我在iphone中编写自定义jabber客户端.

我使用xmppframework作为引擎.

我有UITableViewController和NSMutableArray用于重复联系人列表.

当我收到(或有人更改内容)名单(也就是联系人列表)我想要更改UITableView项目(添加/删除/修改).因此,如果用户在列表更新时使用listView

[items addObject:newItem];
[self.tableView reloadData];
Run Code Online (Sandbox Code Playgroud)

用户丢失当前选择项目.

所以,我的问题是如何保存(如果可能的话,我的意思是如果给定的选项没有删除)reloadData之后的当前选择项目?

谢谢.

Mar*_*rco 68

简单的方法是这样的:

NSIndexPath *ipath = [self.tableView indexPathForSelectedRow];
[self.tableView reloadData];
[self.tableView selectRowAtIndexPath:ipath animated:NO scrollPosition:UITableViewScrollPositionNone];
Run Code Online (Sandbox Code Playgroud)

  • 在iOS8中不起作用; 显然,在selectRowAtIndexPath触发之前,reloadData方法还没有完成.它可以添加一点延迟,但行选择闪烁... (10认同)
  • 有没有办法解决它,但在ios8有点延迟? (2认同)

mar*_*mor 24

在Marco的回答中添加一点:

首先,如果您使用多个选择,您可以将此方法添加到您的方法,ViewController并在需要调用时调用它[tableView reloadData]:

- (void)reloadTableView
{
    NSArray *indexPaths = [self.tableView indexPathsForSelectedRows];
    [self.tableView reloadData];
    for (NSIndexPath *path in indexPaths) {
        [self.tableView selectRowAtIndexPath:path animated:NO scrollPosition:UITableViewScrollPositionNone];
    }
}
Run Code Online (Sandbox Code Playgroud)

其次,如果你在a UITableViewController,你想在tableView出现之后保留选择,那么UITableViewController中就有一个功能:clearsSelectionOnViewWillAppear你可以打开或关闭.

请参阅此处:http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewController_Class/Reference/Reference.html


muh*_*urk 8

Swift 4.2测试

重新加载表视图后更新所选行的正确方法是:

let selectedRows = tableView.indexPathsForSelectedRows

tableView.reloadData()

DispatchQueue.main.async {
    selectedRows?.forEach { selectedRow in
        tableView.selectRow(at: selectedRow, animated: false, scrollPosition: .none)
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

解决方法是使用 reloadSections: 而不是 reloadData。出于某种原因, reloadData 删除了当前选择。

  • 我必须纠正自己。它在 iOS 4.0 中完美运行,但不适用于 4.2 及更高版本 (5认同)

Mob*_*obs -5

听起来您没有使用数据的“模型” - 而只是更新“视图”(用户界面),因此可能是一个糟糕的设计。

reloadData 应该导致视图使用模型中的数据进行更新,该模型应该包含要显示的最新数据。

搜索有关“模型视图控制器模式”的资源