簡體   English   中英

我如何通過managedObjectContext使用情節提要板來初始化下一個控制器

[英]How do I pass the managedObjectContext to init the next controller using storyboard

我有這段代碼可以跳到第二個故事板

UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"SpaceView" bundle:nil];

// Load the initial view controller from the storyboard.
NRGSpacesNavController *nav = [secondStoryBoard instantiateInitialViewController];
nav.managedObjectContext = self.managedObjectContext;
NRGSpacesViewController *spacesController = [nav.viewControllers firstObject];
spacesController.space = space;
[self presentViewController:nav animated:YES completion:nil];

問題是在第二個情節提要板上實例化的控制器需要為其容器視圖使用managedObejectContext。 在prepareForSegue之前加載的唯一東西是實際的init方法。 但是我似乎可以在init方法上添加上下文。 ViewDidLoad和其他任何東西實際上都為時已晚。 如果可以的話,我想保留情節提要,但以編程方式進行所有操作都可以

我嘗試將上下文添加到nag控制器,因為您無法做到這一點。 上下文為零。

感謝您的幫助,歡迎提出任何想法。

在您要移至的UIViewController上創建一個屬性,然后在prepareForSegue:設置該屬性prepareForSegue:

在為過渡提供動力的UIViewController中:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"YourVCSegue"]) {
         NextViewController *nextVC = segue.destinationViewController;
         nextVC.myManagedObjectContext = self.managedObjectContext;
    }
}

UIViewController接口中過渡到:

@interface NextViewController : UIViewController

@property (nonatomic,strong) NSManagedObjectContext *myManagedObjectContext;

@end 

這將在調用init方法之后(必須調用n否則,您將在nil對象上進行設置)並且在調用viewDidLoad之前設置屬性。

另一個選擇( 不推薦使用 )是創建一個包含NSManagedObjectContext的Singleton幫助器類,您可以在整個應用程序中訪問該類。 例如:

[[MyCoreDataHelperClass sharedInstance] managedObjectContext];

有關我在您的應用程序中訪問NSManagedObjectContext的信息,請參閱文檔。

您可以在prepareForSegue方法中將內容分配給即將到來的視圖控制器。 但是視圖控制器實際上是存儲上下文的一個不好的地方。 (導航控制器是視圖控制器)。

更好的方法是將受管對象上下文創建為單例,或者具有一個單獨的類來處理所有核心數據交互並在該類中創建上下文。 編寫一個獲取方法以獲取上下文。

好的,我在這里解決了。

  // Load the initial view controller from the storyboard.
NRGSpacesNavController *nav = [secondStoryBoard instantiateInitialViewController];
NRGSpacesViewController *spacesController = [nav.viewControllers firstObject];
spacesController.space = space;
spacesController.managedObjectContext = self.managedObjectContext;
[self presentViewController:nav animated:YES completion:nil];

我似乎在加載順序時弄錯了。 我也移動了一些東西來設置context屬性。 此代碼首先運行,然后運行容器的(在spacesController內)viewDidLoad,然后運行spacesController viewDidLoad。 因此,我將我的東西加載到那些viewDidLoads中,並且正在使用委托來讓容器知道所包含的對象何時加載其視圖。

盡管有些人可能會發現這種反模式,但我傾向於擁有一個獨特的CoreDataController,它可以管理上下文的創建和共享。 我從不喜歡傳遞上下文的想法,尤其是在多線程環境中。

話雖如此,我將使用以下解決方案之一:

i)創建一個具有NSManagedObjectContext屬性的協議,並讓所有相關的控制器實現該協議。

@protocol MyProtocol

@property(nonatomic,strong) NSManagedObjectContext mySharedContext;

@end

ii)而不是傳遞上下文,如果該應用程序是向下鑽取的接口並且不涉及繁重的多線程,即列表和詳細信息,我將使用相同的協議方法,但是聲明一個通用NSManagedObject,從中可以檢索上下文。

@protocol MyProtocol

@property(nonatomic,strong) NSManagedObject myObject;

@end

然后在目標控制器中

-(void)myMethod {
   // optional casting
   MyParticularManagedObject *obj = (MyParticularManagedObject*)self.myObject;
   NSManagedObjectContext *ctx = obj.managedObjectContext;

   // rest of the code....      

}

iii)最后,請看是否是您的情況:

在具有彈出框樣式的performSegue:withIdentifier:之后不調用prepareForSegue

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM