如何使用托管上下文自定义初始化 Interface Builder 的 UIViewController

Posted

技术标签:

【中文标题】如何使用托管上下文自定义初始化 Interface Builder 的 UIViewController【英文标题】:How to custom init a UIViewController of Interface Builder with managed context 【发布时间】:2011-06-19 18:54:58 【问题描述】:

我正在 Interface Builder 中使用 NavigationController 和 BandListViewController(UITableViewController) 创建一个简单的界面,并将委托设置为 AppDelegate 属性。

@interface CRUDAppDelegate : NSObject <UIApplicationDelegate>    
    UINavigationController *bandNav;

    BandListViewController *bandList;

但是,我不知道如何初始化 BandListViewController 并传递参数 managedObjectContext 而不将其设置在 awakeFromNib 上。 CRUDAppDelegate 已经初始化了这个控制器并将他自己的 nib 设置到 navigationController 中,但是当我尝试使用 initInManagedObjectContext 在 didFinishLaunchingWithOptions 中创建一个新的 BandListViewController 时,显示(TableViewController)仍然是旧的 bandList。 (使用 managedObjectContext = null)

到目前为止,我所做的是按照 Apple 的建议将 bandList managedObjectContext 保持在 awakeFromNib。

- (void)awakeFromNib

    /*
     Typically you should set up the Core Data stack here, usually by passing the managed object context to the first view controller.
     self.<#View controller#>.managedObjectContext = self.managedObjectContext;
    */

    self.bandList.managedObjectContext = self.managedObjectContext; 

我想要什么

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    self.bandList = [[BandListViewController alloc] initInManagedObjectContext:self.managedObjectContext];

    // Override point for customization after application launch.  
    [self.window addSubview:bandNav.view];
    [self.window makeKeyAndVisible];
    return YES;

【问题讨论】:

【参考方案1】:

恭喜;您已经发现了 Interface Builder 的众多恼人限制之一!

全部在代码中完成,免去您的麻烦。真的没有那么多代码。

或者,从当前状态更简单的方法是在 nib 中实例化一个“虚拟”控制器,然后执行 bandNav.viewControllers = [NSArray arrayWithObject:bandList]; 之类的操作。

【讨论】:

【参考方案2】:

application:didFinishLaunchingWithOptions: 中,您正在创建BandListViewController 的新实例,但您从未将其视图插入到视图层次结构中,因此它永远不会显示。

【讨论】:

以上是关于如何使用托管上下文自定义初始化 Interface Builder 的 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章

iOS CoreData+MoGenerator:如何仅在使用嵌套上下文时初始化托管对象一次?

如何初始化自定义视图(控制器),以便它以编程方式和在 Interface Builder 中工作?

为啥委托方法需要将自定义类托管对象上下文的内容保存在委托类托管对象上下文中?

如何使用 Interface Builder 中的自定义 UITableViewCell?

通过UserNotification自定义操作访问时,CoreData无法初始化托管对象

如何在单个托管对象上下文中初始化新的 NSManagedObject 并设置与另一个 NSManagedObject 的关系?