让 UITabBarController 与核心数据一起工作
Posted
技术标签:
【中文标题】让 UITabBarController 与核心数据一起工作【英文标题】:Getting UITabBarController to work with Core Data 【发布时间】:2011-05-26 15:17:32 【问题描述】:我一直在阅读此thread on *** 并一直在尝试在我自己的项目中复制该解决方案,但没有成功。
我的项目有 4 个标签。在我的应用委托中,我这样做:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Page1 *page1 = (Page1 *)[navController topViewController];
Page2 *page2 = (Page2 *)[navController topViewController];
Page3 *page3 = (Page3 *)[navController topViewController];
Page4 *page4 = (Page4 *)[navController topViewController];
page1.managedObjectContext = self.managedObjectContext;
page2.managedObjectContext = self.managedObjectContext;
page3.managedObjectContext = self.managedObjectContext;
page4.managedObjectContext = self.managedObjectContext;
[self.window makeKeyAndVisible];
return YES;
在原始线程中,它说我需要为每个要在其上使用核心数据的选项卡的每个 navController 创建一个 IBOutlet。
虽然您可以为 UINavigationController 分配多个委托,但对于插座而言并非如此,但您只能为 navController 提供一个插座。
我可以让 Page1 工作,但其他页面只是崩溃;因为缺少 IBOutlet。
对于 Y 选项卡,我真的需要 X IBOutlets 还是可以用其他方式来做?
另一个问题是接受答案的原始线程是:
理想情况下,您希望通过 NSManagedObjectContext, NSFetchedResultsController 或 相关的 NSManagedObject “下” 成 UIViewController。
但没有代码或示例说明如何执行此操作。
理想情况下,我不想在所有地方都使用 singelton 或应用程序委托。
任何确认和澄清都会很棒。
谢谢。
【问题讨论】:
【参考方案1】:您的直接问题与 Core Data 无关。当您需要为每个选项卡使用单独的导航控制器时,您正在为每个选项卡分配相同的导航控制器,否则每次更改选项卡时导航控制器的视图层次结构都会被打乱。
您链接到的问题中推荐的模式称为“依赖注入”,它是 Apple 在大多数情况下推荐的模式。然而,在标签栏或任何其他复杂的视图/视图控制器层次结构的情况下,依赖注入可能会变得复杂。这是选项卡栏的一个特殊问题,因为您通常不会在应用程序启动时加载所有选项卡视图/视图控制器,而是等到每个选项卡被选中后再加载其元素。
相反,您可以使用利用 UIApplication 对象单例状态的替代模式。由于只有一个应用程序对象,因此只有一个应用程序委托对象。这意味着您可以在应用程序的任何地方进行如下调用:
(MyApplicationDelegate *) appDelegate=(MyApplicationDelegate *)[[UIApplication sharedApplication] delegate];
... 并且始终获得相同的应用程序对象。然后,如果您将托管对象上下文定义为应用委托的属性,您可以通过以下方式获取上下文:
theManagedObjectContext=appDelegate.managedObjectContext
将这两行添加到每个视图控制器中,您始终可以确保获得应用委托的托管对象上下文。
【讨论】:
你好。谢谢您的回答。只是一些澄清。我是否认为您需要为每个选项卡创建一个单独的导航出口或控制器?至于 appDelegate,我一直认为对核心数据使用这是不好的做法。我要尝试2个想法。 1. 为每个选项卡创建 4 个 IBOutlets。 2. 为每个选项卡创建 4 个不同的导航控制器?或者我可以避免所有这些,而只是使用您使用 appDelegate 的想法 看来你是对的,在每个选项卡中都有 appDelegate 不仅更容易,而且不会丢失上下文。谢谢!以上是关于让 UITabBarController 与核心数据一起工作的主要内容,如果未能解决你的问题,请参考以下文章
无法让辅助 UITableViewController 在 UITabBarController 中显示
在UITabBarController之前呈现Login View Controller
从 UITabBarController 选项卡根视图呈现 UINavigationController