2012-01-31 39 views
3

首先,我應該提到這是我在這個網站上的第一篇文章。我試圖教自己編程iOS,並在我的谷歌搜索找到答案,我發現我一直在這裏指導。所以,感謝所有在這裏做出貢獻的人。你已經幫了我一噸。你如何處理UIManagedDocument?

我一直在經歷斯坦福CS193P階級,喜歡它。但我現在卡住了,不知道該在哪裏轉。

我的問題已經與UIManagedDocument。

我累了做一個簡單的應用程序來測試我的新技能。這就是它的作用:

一個簡單的會計應用程序,跟蹤對募捐活動的個人貢獻。

我有一個UITabBar,在每個選項卡上,您可以: 1.跟蹤參與者(玩家) - 這將連接到地址簿,並允許您添加或保留在這個應用程序中。 2.管理事件(事件) - 您可以添加,編輯或刪除事件,然後您將添加參與者,然後能夠添加他們帶來(銀行)在該事件。 3.設置。 - 我添加了一些按鈕,只是爲了幫助我理清現在的情況,包括清除所有數據的重置按鈕和「虛擬數據」按鈕。

我有三個coreData實體。玩家,事件和銀行都與其他兩個人有關係。

當我第一次嘗試將這個應用程式(預iOS5中)我用的appDelegate創建我ManagedObjectContext,並通過它我viewControllers。這工作。但現在我應該使用UIManagedObjectDocument,而不是使用AppDelegate。我相信我瞭解iCloud的原則和整合。 (我可能是錯的)

使用類的例子和我可以在網上找到的東西我做了一個幫助程序類,它將在我的UINavigationControllers中提供每個ViewController的第一個ManagedDocument。

+ (UIManagedDocument *)sharedManagedDocument 
{ 
    static UIManagedDocument *sharedDocument = nil; 

    NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
    url = [url URLByAppendingPathComponent:@"DefaultAppDatabase"]; 
    // url is "<Documents Directory>/<DefaultAppDatabase>" 

    // Create the shared instance lazily upon the first request. 
    if (sharedDocument == nil) { 
     sharedDocument = [[UIManagedDocument alloc] initWithFileURL:url]; 
    } 

    if (sharedDocument.fileURL != url) { 
     UIManagedDocument *newDocument = [[UIManagedDocument alloc] initWithFileURL:url]; 
     sharedDocument = newDocument; 
    } 

    NSLog(@"SharedDocument: %@", sharedDocument); 

    return sharedDocument; 
} 

然後我有第一個ViewController打開文檔並執行獲取。

從那裏,我通過什麼NSManagedObject通過SEGUE選擇下一個視圖控制器。

問題是當我開始添加或重新設置數據時。 (我假設如果我能使它與「虛擬數據」按鈕一起工作,我可以讓它在單個條目中工作)當我按下「重置」或「虛擬」按鈕時,我的日誌告訴我它是推,但我沒有看到任何數據的變化,直到我重新啓動應用程序。然後它顯示完美。我的猜測是我沒有正確保存文件,或者我沒有正確刷新tableViews。我對使用NSNotification做了一個小小的嘗試,但是沒有深入,因爲我無法對它做出任何迴應。如果需要的話,我很樂意回到那條路上。

這是我的保存方法?非常簡單,只是從默認coreData的appDelegate複製。

- (void)saveContext 
{ 
    NSError *error = nil; 
    NSManagedObjectContext *managedObjectContext = self.appDatabase.managedObjectContext; 
    if (managedObjectContext != nil) 
    { 
     if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) 
     { 
      /* 
      Replace this implementation with code to handle the error appropriately. 

      abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
      */ 
      NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
      abort(); 
     } 
    } 

    [self.appDatabase saveToURL:self.appDatabase.fileURL 
       forSaveOperation:UIDocumentSaveForOverwriting 
       completionHandler:^(BOOL success){ 
        if(!success) NSLog(@"failed to save document %@", self.appDatabase.localizedName); 
        if(success) NSLog(@"Success: save document %@", self.appDatabase.localizedName); 
       }]; 

} 

保羅,從CS193P講師,建議在作業6使用一個輔助方法通過一塊周圍的UIManagedDocument通過。我理解背後的理論,但還沒有完全包圍我的頭,所以我沒有排除我的答案也可能存在。

非常感謝您的幫助,或指引我在正確的方向做更多的研究。對不起,這篇文章太長了,我想盡可能清楚。

回答