Ios 目标C视图控制器属性未保存
您好,我正在尝试设置我的Ios 目标C视图控制器属性未保存,ios,objective-c,xcode,core-data,properties,Ios,Objective C,Xcode,Core Data,Properties,您好,我正在尝试设置我的UIViewController的托管对象上下文,但对象上下文未保存。代码如下: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
UIViewController的
托管对象上下文,但对象上下文未保存。代码如下:
- (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>
在my_TableViewController
的viewDidLoad
()中,输出为null
。oManagedObjectContext声明为(强,非原子)
。有人知道oManagedObjectContext为什么变为null吗
viewDidLoad代码:
- (void)viewDidLoad {
[super viewDidLoad];
UINib *nib = [UINib nibWithNibName:@"my_TableViewCell" bundle:nil];
[[self tableView] registerNib:nib forCellReuseIdentifier:@"tableViewCell"];
NSLog(@"%@", self.oManagedObjectContext);
}
问题是,
didfishlaunchingwithoptions
正在实例化一个新的视图控制器,然后对其不做任何操作(即丢弃它)。因此,您将看到两个不同的视图控制器实例
您可以让应用程序委托设置根视图控制器的
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;
}
显然,如果您的视图控制器不是根控制器(例如,如果它位于某些容器视图控制器中,例如导航控制器、选项卡栏控制器、自定义容器控制器等)然后,您必须调整上述代码以在该层次结构中导航以找到视图控制器类。在appdelegate managedObjectContext中存在,但在vc中不存在?在我的vc中,我声明了@property(强,非原子)NSManagedObjectContext*oManagedObjectContext;你能提供你的viewDidLoad的代码吗?你把这个vc推到导航栈了吗?从这个上下文中不清楚,我用故事板来组织我项目的布局。视图控制器位于导航堆栈上。答案是苹果不鼓励使用这种方法。[是否仍要保留我实例化的旧视图控制器?^同意。”创建视图控制器时,您要向其传递一个上下文。您要传递一个现有上下文,或者(在希望新控制器管理一组离散编辑的情况下)您为其创建的新上下文。应用程序委托通常负责创建要传递给显示的第一个视图控制器的上下文。”从好的角度来看。苹果在这一点上是正确的,将必要的信息传递给视图控制器几乎总是比从应用程序代理中提取信息要好。这在这里没有实质性影响,但这是正确的方法。我相应地修改了我的答案。
- (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;
}