【问题标题】:ios/xcode/coredata: How to refresh detail view in Master Detail setupios/xcode/coredata:如何在主详细信息设置中刷新详细信息视图
【发布时间】:2015-06-27 23:28:11
【问题描述】:

我想刷新 MasterDetail 项目中的详细信息页面。 (在模态控制器中进行编辑后,应刷新详细信息。)我知道将代码块放在详细信息页面的哪个位置以强制刷新。我只是不知道使用什么代码来执行此操作。

此详细信息页面没有表格视图。它只使用文本标签和图像标签。

在新获取时刷新数据的 NSFetchedResultsController 不在此视图控制器中,而是在派生此详细信息的表视图中。

有没有办法刷新类似于[[self tableView] reloadData]的详情页中的数据;在表格页面中?

这是显示模态视图控制器的代码,我需要在其中放置代码块。

UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController: editVC];
    // Do whatever setup you want to here for your title bar, etc
    [self presentViewController:nav animated:YES completion:^{
       //CODE TO EXECUTE TO REFRESH CONTROLLER GOES HERE
    }];

我可以放什么代码来刷新控制器?

我认为刷新文件中任何地方的细节视图控制器的代码都是相同的。

感谢您的任何建议。

编辑:我可能错了,上面的代码将在模式解除时执行。它可能只是在动画完成后执行。

但是,我仍在寻找代码以从类似于 [[self tableView] reloadData]; 的 fetchedresultscontroller 刷新不是 tableview 的视图控制器;如果这里有tableview。

编辑2:

我正在尝试在两个不同的地方刷新以下编辑的保存方法(它确实成功地保存了数据并关闭了模态编辑控制器。它只是在模态编辑屏幕消失后不更新详细信息屏幕)。 (我的理解是,在这种情况下 self 真的很短,因为 self.presentingViewController 会执行实际的解雇。)

if ([self.managedObjectContext save:&error]) {
            // Dismiss View Controller
            NSLog(@"Presenting controller%@",[self.presentingViewController class]);
            ItemDetailVC *detailVC = [[ItemDetailVC alloc] init];//VC instantiated to be able to call method but this is probably an error as per Mundi's comment below
            [detailVC reloadViewData];           
            NSLog(@"About to dismiss modal editVC");
            [super dismissViewControllerAnimated:YES completion:^{
                NSLog(@"in middle of dimissing");
                ItemDetailVC *detailVC = [[ItemDetailVC alloc] init];
                [detailVC reloadViewData];
            }

这里是详细的VC方法reloadViewData。

详细.m

 -(void)reloadViewData {
  //short version of UI          
        self.itemLabel.text = self.item.name;
        self.itemSub.text = self.item.sub;
        NSLog(@"In detail controller and about to call setneedsdisplay");
        [self.itemLabel setNeedsDisplay];
    [self.itemSub setNeedsDisplay];
    }

这种方法确实会触发详细控制器中的 reloadViewData(基于日志输出),但不会更新视图。

【问题讨论】:

  • 不是重复的。另一个问题没有答案。这段代码也放在另一个地方。很明显,您将此标记为重复,因为您对使用 viewWillAppear 的另一个问题的建议没有成功。
  • 您的代码更新揭示了另一个问题。您必须关闭编辑控制器以显示其“下方”的细节控制器,而不是创建新的细节控制器!
  • 是的,这是有道理的。我分配一个新的细节控制器的原因是可以访问方法 loadDetail 但你是对的,我正在创建一个新实例并在该实例中重新加载它,而不是在已经存在的那个实例中。问题是我不知道如何在以前的细节控制器中调用方法,因为 [detailVC loadView] 在没有创建新的 detailVC 实例的情况下抛出错误消息。

标签: ios core-data reload presentviewcontroller


【解决方案1】:

是的,完成块将在控制器出现后运行,而不是在它被解除后运行。

有几种方法可以做到这一点:

  • 您可以让详细视图控制器成为编辑视图控制器的委托。关闭后,编辑 VC 将通知细节 VC 更改,然后可以更新其 UI;
  • 另一种可能性是简单地保存已编辑的托管对象并让详细 VC 监听 通知NSManagedObjectContextDidSaveNotification;
  • 更简单的方法是让详细信息 VC 成为编辑 VC 的关闭按钮的响应者并在那里处理 UI 更新。

没有与reloadData 等效的表视图。就像在表格视图中您必须编写自己的代码将正确的数据放入表格单元格的标签中一样,您还必须编写自己的代码来填充详细视图的自定义标签和视图。只需创建一个方法reloadViewData 并使用它来初始化和更新您的视图。

【讨论】:

  • 我创建了一个方法,根据上面的编辑将标签设置为值。但是,详细视图中的代码位于 viewdidload 方法中。我们回到了当我试图从编辑页面调用 viewdidload 时如何重新加载页面的问题,但是虽然确实调用了该方法(从日志输出),但它并没有更新页面。
  • 您不应自己调用 viewDidLoad。通过我在回答中描述的三种方法之一调用更新 UI 的例程。典型的设置是使用委托
  • 我正在使用委托协议 NSFetchedResultsControllerDelegate 来更新 tableVIew。详细视图也注册了这个委托协议。但是,Apple 文档中推荐的委托方法都引用了 tableviews。我试图让他们在没有成功的情况下处理细节。苹果建议的代码太长,无法在此处发布,但可以在此链接中看到。 developer.apple.com/library/ios/documentation/CoreData/…
猜你喜欢
  • 2010-12-06
  • 1970-01-01
  • 2019-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多