目前,我有一个 NSMutableArray,它从我的应用程序中的 NSUserDefaults 加载并将数据提供给我的 UITableView。 NSMutableArray 由 NSDictionary 组成,每个 NSDictionary 由 5 或 6 个键组成。
然后在 UITableView 所在的 View 中,我有一个 UISegmentedControl,用户可以在其中根据日期或其他一些内容对 UITableView 进行排序。
因此,当他们单击日期段时,我执行以下代码:
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"Date" ascending:NO];
[self.cellArray sortUsingDescriptors:[NSArray arrayWithObject:descriptor]];
排序本身有效,因为我可以看到 self.cellArray 通过 NSLogs 进行排序。尽管当我调用 tableview 来 reloadData 时,没有任何 NSDictionary 实际上在 tableview 本身中重新排序。因此,以编程方式对它们进行排序,但不在 UI 中进行排序,这非常奇怪。
如果在我上面发布的代码之后使用此 for 语句:
for (NSDictionary *dict in self.cellArray) {
NSLog(@"DateKey: %@", [dict objectForKey:@"Date"]);
}
如果我升序,这就是我的 NSLogs 的样子:是:
2012-05-20 13:48:21.008 App[71308:707] DateKey: 2012-05-13 18:19:22 +0000
2012-05-20 13:48:21.009 App[71308:707] DateKey: 2012-05-13 18:19:29 +0000
2012-05-20 13:48:21.009 App[71308:707] DateKey: 2012-05-15 01:54:13 +0000
2012-05-20 13:48:21.010 App[71308:707] DateKey: 2012-05-15 04:01:15 +0000
2012-05-20 13:48:21.011 App[71308:707] DateKey: 2012-05-16 04:08:20 +0000
2012-05-20 13:48:21.012 App[71308:707] DateKey: 2012-05-16 04:13:59 +0000
2012-05-20 13:48:21.012 App[71308:707] DateKey: 2012-05-16 04:32:29 +0000
2012-05-20 13:48:21.013 App[71308:707] DateKey: 2012-05-16 04:32:38 +0000
如果我升序:不,这就是我的 NSLogs 的样子:
2012-05-20 13:56:25.956 App[71468:707] DateKey: 2012-05-16 04:32:38 +0000
2012-05-20 13:56:25.960 App[71468:707] DateKey: 2012-05-16 04:32:29 +0000
2012-05-20 13:56:25.961 App[71468:707] DateKey: 2012-05-16 04:13:59 +0000
2012-05-20 13:56:25.961 App[71468:707] DateKey: 2012-05-16 04:08:20 +0000
2012-05-20 13:56:25.962 App[71468:707] DateKey: 2012-05-15 04:01:15 +0000
2012-05-20 13:56:25.962 App[71468:707] DateKey: 2012-05-15 01:54:13 +0000
2012-05-20 13:56:25.963 App[71468:707] DateKey: 2012-05-13 18:19:29 +0000
2012-05-20 13:56:25.964 App[71468:707] DateKey: 2012-05-13 18:19:22 +0000
正如您所看到的,排序确实可以正常工作,但是一旦我在该代码之后执行 reloadData,我的 UITableView 就不会根据 Date 键对单元格重新排序。
我的tableview实际上是在IB中连接的并且不为零。如果重要的话,我确实有一个 setter 和 getter。
有人知道为什么会发生这种情况吗?或者您需要更多上下文/代码吗?
谢谢!
最佳答案
我倾向于将您的日志记录放在...
for (NSDictionary *dict in self.cellArray)
NSLog(@"DateKey: %@", [dict objectForKey:@"Date"]);
在您调用 sortUsingDescriptors
以及 cellForRowAtIndexPath
方法之后。我还会在 cellArray 初始化的地方放置一个 NSLog 语句(以确保您不会意外地再次调用该语句……如果您的例程变得复杂,则很容易做到)。
我必须相信 cellForRowAtIndexPath
中的顺序不会反射(reflect)您排序后立即得到的顺序。假设是这种情况,要么 cellArray 在某个地方被重置(即你在哪里填充它?在 viewDidLoad 中还是其他地方?),或者你的 sortUsingDescriptors 没有像你想象的那样被调用。
只需开始在各种例程中放置断点和/或调试消息即可。它必须是简单的事情。我刚刚在重新加载时进行了重新加载测试,并且排序顺序被保留。所以它必须是简单的事情。
关于ios - reloadData 不适用于 UITableView 数据源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10675792/