为啥“[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,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]