2014-01-24 39 views
1

我正在閱讀this great tutorial,作者解釋瞭如何使用.xib文件(第11節)將視圖控制器連接到應用程序委託,以便使用不同的Core Data視圖控制器。不幸的是,這篇文章是在2011年編寫的,因爲.xib在Xcode 5中不再可用,並且被Storyboard取代,所以相當過時。從AppDelegate連接到Xcode 5上的Core Data應用程序中的ViewController

通過快速搜索,我發現how to connect AppDelegate to view controller from within storyboard,通過在識別檢查器窗格上使用視圖控制器的故事板唯一標識符。但是,我想知道是否有必要在當前的開發環境(Xcode 5和iOS 7)的appdelegate中建立這樣的連接,因爲即使我不打算做這樣的連接,我也沒有任何問題 - 所有我做了導入視圖控制器在AppDelegate.h並宣佈其實例爲財產(即@property (strong, nonatomic) MyViewController *myViewController;),並最終連接managedObjectContext之間的兩個對象,因此我甚至沒有宣佈它爲IBOutlet,如上述職位的作者解釋。

我已經運行了它的模擬器,到目前爲止我還沒有遇到過任何問題。然而,「迄今爲止」意味着我寫的所有內容都是視圖控制器的managedObjectContext與App Delegate的連接,我想知道它是否必須從storyboard內部連接爲IBOutlet,以便更加複雜的實現向前發展,包括插入和刪除託管對象或將表視圖連接到NSFetchedResultsController

所以任何人都可以教我應該採取哪種方式?如果不需要明確連接,那麼爲什麼它需要在舊版本中,但現在不需要?

回答

2

Apple標準XCode模板項目從AppDelegate分配viewController的managedObjectContext屬性,如以下代碼所示,其中我註釋了該屬性的設置。這種方法的問題在於,如果設置核心數據堆棧需要很長時間,例如在遷移大型存儲文件時,此方法將阻止用戶界面。

在v4示例應用程序中,masterViewController在發送通知時設置了managedObjectContext - 同時顯示「正在加載,請稍候...」消息。下載並運行應用程序或觀看視頻。

只要在執行諸如創建,刪除或修改對象等操作時使用相同的managedObjectContext,就可以以任意方式在viewController中設置managedObjectContext。看看這裏的示例應用程序,瞭解我如何使用單例對象創建核心數據堆棧,並根據需要管理商店與iCloud之間的遷移。每個viewController都會在需要時直接訪問單例的managedObjectContext。示例中的detailViewController具有managedObject屬性,它使用managedObject的managedObjectContext來處理所有更新(保存),因此不需要直接設置managedObjectContext屬性。

http://ossh.com.au/design-and-technology/software-development/sample-library-style-ios-core-data-app-with-icloud-integration/

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

    // Override point for customization after application launch. 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { 
     UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController; 
     UINavigationController *navigationController = [splitViewController.viewControllers lastObject]; 
     splitViewController.delegate = (id)navigationController.topViewController; 

     UINavigationController *masterNavigationController = splitViewController.viewControllers[0]; 
     MasterViewController *controller = (MasterViewController *)masterNavigationController.topViewController; 
     //controller.managedObjectContext = [[OSCDStackManager sharedManager] managedObjectContext]; 
    } else { 
     UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController; 
     MasterViewController *controller = (MasterViewController *)navigationController.topViewController; 
     //controller.managedObjectContext = [[OSCDStackManager sharedManager] managedObjectContext]; 
    } 
    FLOG(@"didFinishLaunchingWithOptions done."); 

    return YES; 
} 
+0

所以你的意思是我沒有把它從故事板內連接 - 這足以導入視圖控制器,它聲明爲財產,並連接的AppDelegate的管理對象方面,對不對?然後我想知道爲什麼上述帖子的作者爲什麼使用xib連接它,尤其是因爲它不能解決阻塞問題,正如你在答案中所解釋的那樣...... – Blaszard

+0

我通常不會使用故事板 - 但是,只需使用Core Data的Xcode主細節模板創建一個新應用程序,並查看它們在AppDelegate中的設置。毫無疑問,作者沒有考慮到阻止問題 - 蘋果的模板應用程序也沒有。 –

+0

我明白了,謝謝你的好評。 – Blaszard

相關問題