目标 C 视图控制器属性未保存

Posted

技术标签:

【中文标题】目标 C 视图控制器属性未保存【英文标题】:Objective C view controller property not saving 【发布时间】:2015-06-26 05:53:15 【问题描述】:

您好,我正在尝试设置我的 UIViewController's 托管对象上下文,但对象上下文未保存。代码如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
my_TableViewController *viewController = [mainStoryboard instantiateViewControllerWithIdentifier:@"coretut"];
if ([viewController isKindOfClass:[my_TableViewController class]]) 
    [viewController setOManagedObjectContext:self.managedObjectContext];

NSLog(@"%@", self.managedObjectContext);
NSLog(@"%@", viewController.oManagedObjectContext);

下面的输出是

Apple_Tutorial[11241:461826] <NSManagedObjectContext: 0x7fb558d86600>
Apple_Tutorial[11241:461826] <NSManagedObjectContext: 0x7fb558d86600>

但是当我打电话时

NSLog(@"%@", self.oManagedObjectContext);

viewDidLoad() 中,my_TableViewController 的输出是null。 oManagedObjectContext 被声明为(strong, nonatomic)。有谁知道为什么 oManagedObjectContext 变为空?

viewDidLoad 代码:

- (void)viewDidLoad 
    [super viewDidLoad];
    UINib *nib = [UINib nibWithNibName:@"my_TableViewCell" bundle:nil];
    [[self tableView] registerNib:nib forCellReuseIdentifier:@"tableViewCell"];

    NSLog(@"%@", self.oManagedObjectContext);

【问题讨论】:

在appdelegate managedObjectContext中存在,但在vc中不存在? 在我的 vc 中,我声明了 @property (strong, nonatomic) NSManagedObjectContext *oManagedObjectContext; 你能提供你的 viewDidLoad 的代码吗? 你把这个 vc 推送到导航堆栈了吗?从这个上下文中不清楚 我使用故事板来组织我的项目布局。视图控制器位于导航堆栈上。 【参考方案1】:

问题是didFinishLaunchingWithOptions 正在实例化一个新的视图控制器,然后什么都不做(即丢弃它)。因此,您正在查看两个不同的视图控制器实例。


您可能让应用委托设置根视图控制器的oManagedObjectContext

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    ViewController *controller = (id)self.window.rootViewController;
    NSAssert([controller isKindOfClass:[ViewController class]], @"Root controller should be `ViewController`, but is %@", controller);

    controller.oManagedObjectContext = self.managedObjectContext;

    return YES;

很明显,如果您的视图控制器不是根控制器(例如,如果它位于某些容器视图控制器中,例如导航控制器、标签栏控制器、自定义容器控制器等),那么您必须进行调整上面的代码在该层次结构中导航以找到您的视图控制器类。

【讨论】:

这个答案说苹果不鼓励使用这种方法。 [***.com/questions/7799625/… 无论如何要保留我实例化的旧视图控制器? ^ 同意。 “当你创建一个视图控制器时,你会传递一个上下文。你传递一个现有的上下文,或者(在你希望新控制器管理一组离散的编辑的情况下)你为它创建的新上下文。通常是应用程序委托创建上下文以传递给显示的第一个视图控制器的责任。”来自the Apple Documentation 好点。 Apple 在这一点上是正确的,将必要的信息 传递给 视图控制器而不是 应用程序委托中提取它几乎总是更好。它在这里没有实质性影响,但它是正确的方法。我已经相应地修改了我的答案。

以上是关于目标 C 视图控制器属性未保存的主要内容,如果未能解决你的问题,请参考以下文章

核心数据 - 保存和检索属性 - 示例代码

返回视图控制器 1 然后返回视图控制器 2 时未保存 UserDefault

故事板 Segue 未加载视图

prepareForSegue 目标控制器属性未设置

MVC 视图未加载

如果未关闭键盘,则在使用搜索栏时进行 segueing 会更改目标视图控制器布局