reloadData 后保存 UITableView 中选定的行
我在 iPhone 中编写自定义 Jabber 客户端。
我使用 xmppframework 作为引擎。
我有 UITableViewController 和 NSMutableArray 作为代表联系人列表。
当我收到(或有人更改其内容)名册(又名联系人列表)时,我想更改 UITableView 项目(添加/删除/修改)。因此,如果用户在用户更新列表时使用 listView
[items addObject:newItem];
[self.tableView reloadData];
丢失当前选择项。
所以,我的问题是如何在重新加载数据后保存(如果可能,我的意思是如果给定的选定项目未删除)当前选择项目?
谢谢。
I write custom jabber client in iphone.
I use xmppframework as engine.
And I have UITableViewController with NSMutableArray for repesent contact list.
When i receive(or somebody change it contents) roster (aka contact list) i wanna change UITableView items (add/remove/modify). So if User work with listView at time when list updates by
[items addObject:newItem];
[self.tableView reloadData];
user lost current selection item.
So, my question is howto save (if possible, i mean if given selected item not removed) current select item after reloadData?
Thx.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(14)
这对我有用:
技巧是让 selectRowAtIndexpath 稍后运行一点。上面的代码是一个 Xcode 模板,您可以在开始编写
dispatch_after
时选择。This works for me:
The trick is to make selectRowAtIndexpath run later a bit. The code above is an Xcode template you can select when you start writing
dispatch_after
.如果您想要更新表并保留选择,这是一种解决方案:
This is a solution for the case if you want to do table updates and keep the selection:
编辑:
经过测试,
它并不总是有效!,
原因是索引可能会改变!
所以正确的方法是
创建新变量
并在 didSelectRow 上
然后将函数更改为
==========
@marmor 答案有效,
的 Swift 版本
这是他的代码Swift 4.2.3
Edit:
After testing,
it doesn't always work!,
the reason is the index may change !
so the correct way is
make new variable
and on didSelectRow
then change the function to
==========
@marmor Answer worked
this is a Swift version of his code
Swift 4.2.3
很多这些答案基本上都是使用黑客来重新选择之前突出显示的行,方法是从表视图中找出之前选择的行,这似乎是一个不好的方法,因为通常当你的表视图重新加载时,填充表视图的数据发生变化。
因此,请根据您的数据重新选择行
A lot of these answers are basically using hacks to re-select the row that was previously highlighted by finding out what the previously selected row was from the table view which seems like a bad way to go about it, because usually when your tableview reloads, there is a change in the data that is populating the tableview.
So rather base you re-selection of the row based on your data
SWIFT 3:
SWIFT 3:
我通过声明一个数组来存储所选单元格的 ID 或字符串文本,并将其添加到 didSelectItemAtIndexPath 函数中,从而更好地解决了这个问题。
这样,即使行数发生变化,所选行也不会发生变化。
例如:
在您的初始 cellForItemAtIndexPath 上
I solved it better by declaring an array to store, let's say, the ID or String Text of the cell you have selected, and adding it on the didSelectItemAtIndexPath function.
This way, even if the number of rows changes, the selected ones won't.
For example:
And on your initial cellForItemAtIndexPath
我对 UICollectionView 的两分钱:(归功于 Basil..)
当我从后台任务重新加载时,我确实在主线程中运行:
my two cents for UICollectionView: (credits to Basil..)
I do run in main thread as I reload from a background task:
听起来您没有使用数据的“模型” - 而只是更新“视图”(用户界面),因此可能是一个糟糕的设计。
reloadData 应该导致视图使用模型中的数据进行更新,该模型应该包含要显示的最新数据。
搜索有关“模型视图控制器模式”的资源
It sounds like you are not using a 'model' for the data - rather simply updating the 'view' (user interface), and thus is probably a bad design.
reloadData should cause the view to be updated with data from the model, which should contain the most current data to be displayed.
search for resources on the 'model view controller pattern'
简单的方法是这样的:
The easy way is something like this:
在 Marco 的答案中添加一点:
首先,如果您使用多重选择,您可以将此方法添加到您的
ViewController
中,并在需要调用时调用它[tableView reloadData]
:其次,如果您在
UITableViewController
中,并且希望在 tableView 出现后保留选择,UITableViewController 中有一个功能:clearsSelectionOnViewWillAppear
您可以打开或关闭。请参阅此处: http://developer.apple .com/library/ios/#documentation/uikit/reference/UITableViewController_Class/Reference/Reference.html
Adding a bit to Marco's answer:
First, if you're using multiple selection, you can add this method to your
ViewController
and call it whenever you need to call[tableView reloadData]
:Second, if you're in a
UITableViewController
and you want to preserve selection after tableView appears there's a feature in UITableViewController:clearsSelectionOnViewWillAppear
you can turn on or off.See here: http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewController_Class/Reference/Reference.html
已测试 Swift 4.2
重新加载表视图后更新所选行的正确方法是:
Swift 4.2 Tested
The correct way to update selected rows after reload table view is:
解决方法是使用 reloadSections: 而不是 reloadData。由于某种原因 reloadData 删除了当前选择。
The workaround is to use reloadSections: instead of reloadData. For some reason reloadData removes the current selection.
添加延迟对我来说不起作用(在 iOS 8.4 和 iOS 9 上测试)。有效的方法是在调用
-selectRowAtIndexPath:animated:scrollPosition:
之后,在选定的单元格上添加对-layoutIfNeeded
的调用。Adding a delay didn't work for me (tested on iOS 8.4 and iOS 9). What did work was adding a call to
-layoutIfNeeded
on the selected cell, after calling-selectRowAtIndexPath:animated:scrollPosition:
.在 iOS 9.3 和 Swift 2.x 上,我只需在主线程上调用该函数:)
On iOS 9.3 and Swift 2.x, I simply had to call the function on the main thread :)