【问题标题】: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?

标签: iphone uitableview reloaddata


【解决方案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];

    希望对你有帮助.....

    【讨论】:

      猜你喜欢
      • 2019-05-20
      • 2020-12-04
      • 2014-08-08
      • 2023-04-01
      • 2013-11-14
      • 1970-01-01
      • 2022-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多