【问题标题】:IOS/Xcode/Coredata: What is equivalent of [[self tableView] reloadData]; when there is no tableview?IOS/Xcode/Coredata:相当于[[self tableView] reloadData];什么时候没有tableview?
【发布时间】:2015-06-29 01:17:33
【问题描述】:

在没有 tableView 的情况下,必须有一种方法可以使用 NSFetchedResultsController 更新 UIViewController 或视图?

在这种情况下,有一些标签和一张图片。我只想用 managedobjectcontext 中的最新数据刷新它们。

谢谢。

【问题讨论】:

  • 查看 Marcus Zarra 的回答:stackoverflow.com/questions/3216685/…
  • 这是一个很好的讨论,但没有提供任何等效于 [tableview reload] 的代码。这是从托管对象上下文重新加载,所以不使用核心数据的大部分。
  • 您是对的,但是它确实讨论了您可以在数据更改时响应通知并采取相应措施。因此,每当您的 VC 收到例如 NSManagedObjectContextDidSaveNotification 时,它就可以为您显示数据的子视图调用 setNeedsDisplay
  • 好的。我会试试这个。我必须学习如何使用通知,因为这对我来说是新的。
  • 听起来像 setNeedsDisplay 不会更新 NSManagedObjectContext 中的元素......它更适合绘图。我真的需要弄清楚如何刷新屏幕。这在web编程中太琐碎了……看起来很奇怪,在IOS中却如此复杂。

标签: ios core-data nsfetchedresultscontroller reload


【解决方案1】:
[myView setNeedsDisplay]; 

将重绘视图。

[myView setNeedsLayout];

将更新布局。

编辑:阅读 cmets 后,很清楚您要做什么。它被称为 UI 数据绑定,iOS 本身并不支持它。你可以在 github 上搜索可能的开源实现,但我不能保证或推荐任何实现,因为我没有使用过。我的建议是将数据的拉取和显示封装在一个函数中,并简单地调用它来重新加载所有内容,特别是如果数据的重新加载是事件的结果:

-(void)loadDataFromDatabaseAndDisplayIt{
      NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init];
      NSEntityDescription* entity = [NSEntityDescription
                  entityForName:@"User" inManagedObjectContext:self.context];
     [fetchRequest setEntity:entity];
      NSArray* data = [self.context executeFetchRequest:fetchRequest error:&error];

      User* firstUser = data[0];

      self.labelName.text = firstUser.name;
      self.labelPhoneNumber.text = firstUser.phoneNumber;
      //...
}

-(void)viewDidLoad{
     //...
     [self loadDataFromDatabaseAndDisplayIt];
}

-(void)someEventDidOccurThatShouldReloadData:(id)sender{
     [self loadDataFromDatabaseAndDisplayIt];
}

【讨论】:

  • 我是否需要将 setNeeds Display 作为一种方法放在视图中?这会从托管对象上下文中提取最新数据吗?
  • 它是否与 NSFetchedResultsController 和 CoreData 一起在数据驱动的屏幕中提取最新数据?
  • 不,您必须在应用程序级别执行此操作。
  • 我已经尝试过 setNeedsDisplay,但得到以下错误:没有可见的 @interface for itemDetailVC(我的视图,你称之为)声明了选择器 setNeedsDisplay。这是一个更大的班级的一部分吗? VC 是 NSobject 的后代。
  • 确定了 setNeedsDisplay 的语法。我正在使用 [self.itemLabel setNeedsDisplay] 并且不再收到错误消息。但是页面没有更新新数据。
【解决方案2】:

表格视图的reloadData 所做的是调用例如cellForRowAtIndexPath 多次,这是您自己添加代码以设置标签内容等的地方。

同样,您必须自己设置标签和其他 UI 出口的内容。 setNeedsDisplay 只会重绘屏幕,不会用数据更新你的 UI 元素。您必须在控制器中“手动”执行此操作。

创建一个名为reloadViewData 的方法,并使用当前数据对象重置所有标签。这不是很多工作,因为大概您已经为初始视图设置编写了此代码。只需将其分解到此方法中并调用它来进行视图设置和视图更新。

【讨论】:

  • 我创建了方法并在关闭控制器之前调用它但是得到了相同的结果。我需要将 setNeedsDisplay 放在方法的底部吗?根据下面的评论,setNeedsDisplay 目前不适合我。
  • 已经创建了一种方法 reloadViewData ,它将所有标签设置为它们在 managedobjectcontext 中的值。我是否必须像 [self.itemLabel setNeedsDisplay];[self.itemDetail setNeedsDisplay]; 中的每一个都做 setNeedsDisplay等等?仅使用 itemLabel 尝试过,仍然没有显示新数据。
  • 您可以忘记 setNeedsDisplay。如果没有显示数据,则有另一个原因。您在loadDataFromDatabaseAndDisplayIt 中所做的是正确的,只需单步执行您的代码,看看您是否有预期的数据。
  • 我单步执行了代码,在完成获取之后,名称和所有其他数据都为空。这里似乎存在不匹配,因为没有谓词的 fetch 应该返回整个记录集而不是这个特定记录。在任何情况下,它都会显示为 null。
猜你喜欢
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 2017-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多