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)
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
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 删除了当前选择。
Mob*_*obs -5
听起来您没有使用数据的“模型” - 而只是更新“视图”(用户界面),因此可能是一个糟糕的设计。
reloadData 应该导致视图使用模型中的数据进行更新,该模型应该包含要显示的最新数据。
搜索有关“模型视图控制器模式”的资源
| 归档时间: |
|
| 查看次数: |
25210 次 |
| 最近记录: |