为啥“[self.tableView reloadData]”不能确保我看到刚刚添加到 UITableView 的数据的最新行? (包括代码)
Posted
技术标签:
【中文标题】为啥“[self.tableView reloadData]”不能确保我看到刚刚添加到 UITableView 的数据的最新行? (包括代码)【英文标题】:why doesn't "[self.tableView reloadData]" ensure I see the latest row for data I just added to a UITableView? (code included)为什么“[self.tableView reloadData]”不能确保我看到刚刚添加到 UITableView 的数据的最新行? (包括代码) 【发布时间】:2011-03-31 07:12:23 【问题描述】:为什么 "[self.tableView reloadData]" 不能确保我看到我刚刚添加到 UITableView 的数据的最新行? (包括代码)这是在从 AddItem 控制器返回到此委托方法之后 I:
使用新值更新核心数据存储库 调用:“[self.tableView reloadData]” 关闭模态视图 然后回到 UITableView 新行不存在? 当我在模拟器中停止并重新启动 iPhone 应用程序时,该行确实显示正确为什么“reloadData”在这里对我不起作用,我该怎么办?
注意我知道有一种方法可以通过表格视图中的“insertRowsAtIndexPaths”手动创建一个新行。不确定哪种方法最好,但无论如何都想了解为什么 reloadData 在这里不起作用。
代码:
- (void)newItemController:(NewItemController *)controller didFinishWithSave:(BOOL)save newItemText:(NSString*)itemText
// Add data to CoreData store
WEView *newWEView = (WEView *) [NSEntityDescription insertNewObjectForEntityForName:@"WEView" inManagedObjectContext:managedObjectContext];
newWEView.title = itemText;
NSError *error = nil;
if (![managedObjectContext save:&error])
// Handle the error.
DLog(@"ERROR DURING SAVE");
abort();
// Dismiss the modal view to return to the main list
[self dismissModalViewControllerAnimated:YES];
// Reload Data
[self.tableView reloadData];
谢谢
PS。这是我用来填充 tableview 数据实例变量的代码:
- (void)updateTableDataViaCoreData
// Core Data Request
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"WEView" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];
// CoreData Sort Descriptor
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortDescriptor release];
// Core Data - Execute Request
NSError *error = nil;
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
if (mutableFetchResults == nil)
// Handle the error.
DLog(@"Error when fetching data");
abort();
// Core Data finish Up
[self setViewConfigArray:mutableFetchResults];
[mutableFetchResults release];
[request release];
【问题讨论】:
Yu=我们的表必须从某个存储/数组中获取值,您是否也在更新 dat? 【参考方案1】:从您的代码示例中,您似乎使用了推荐的 Core Data 方法,其中您有一个 NSFetchedResultsController 管理 tableview 的数据。如果是这种情况,那么您需要在调用 reloadData 之前告诉 tableview 的 fetchedresultscontroller 重新获取数据。
所以在 reloadData 之前,告诉你的 NSFetchedResultsController 重新获取数据
[[self frc] performFetch:&error];
将对象插入 managedcontext 不会使其对 tableview 可用。
【讨论】:
感谢 ferdil - 这在重新获取后有效 - 我唯一的问题是,在我的情况下,我没有任何代表提取的实例变量,所以我基本上必须再次调用所有代码从核心数据存储中获取所有行 - 这听起来正确还是有不那么繁琐的方法来做到这一点?我已经在原始帖子中发布了我当前用于更新列表视图数据的代码,所以现在这个方法是从 viewDidLoad + update row 方法调用的。 Greg - 有一种方法可以不那么笨拙,但它变得非常复杂。然后你需要实现一堆委托来更新你的 tableView (beginUpdates/endUpdates) 我使用示例“Recipes”来学习如何使用 CoreData 和获取请求【参考方案2】:在关闭视图控制器之前尝试重新加载数据
【讨论】:
【参考方案3】:您必须使用 as 调用表重新加载
[classname.tableview reloadData];
希望对你有帮助.....
【讨论】:
以上是关于为啥“[self.tableView reloadData]”不能确保我看到刚刚添加到 UITableView 的数据的最新行? (包括代码)的主要内容,如果未能解决你的问题,请参考以下文章
为啥使用 glTranslatef?为啥不直接更改渲染坐标?
为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?