2014-01-10 55 views
0

像很多人前來我一樣 - 我以「我是iOS新手」爲開端。我在這裏和那裏問了幾個問題。TabBar項目 - 桌面視圖中的核心數據

我有一個項目,我正在使用tabbar項目進行設置。

我在底部有4個選項卡,其中之一是「編輯」,當用戶點擊它們時顯示一個帶有月份選擇器的視圖。當他們選擇月份時 - 屏幕應該加載一個tableview,填充來自coredata的相應月份條目。

我在我的應用程序委託中設置了coredata - 但我很好奇,然後如何在應用程序中更深入地獲取信息到我的tableview中?

我已經通過THIS TUTORIAL on coredata工作過,並且在執行master-detail項目時已經能夠正常工作,但這是我工作的一個tabbar項目。

我一直在使用storyboard的大部分佈局。

我不斷收到錯誤,當我嘗試使用這條線在viewDidLoad中:

NSManagedObjectContext *context = [self managedObjectContext]; 

的錯誤是:

No visible @interface for 'myEditPageViewController' declares the selector 'managedObjectContext' 

我進口:

#import "myEditPageViewController.h" 
#import "myAppDelegate.h" 
#import "CoreData/CoreData.h" 

我現在viewDidLoad看起來像這樣(我從一些在線挖掘 - 記住,我對這個東西很新):

self.context = [self context]; 
if (self.context == nil) 
{ 
self.context = [(myAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
} 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init]; 
NSManagedObjectContext *context = [self managedObjectContext]; 

有什麼想法?我試圖將該教程應用到我的應用程序 - 但由於它不是主細節,因此還有其他視圖。試圖讓它工作來顯示coredata信息!

回答

1

關於錯誤

「爲myEditPageViewController無可見@interface聲明選擇器managedObjectContext

選擇器是方法的另一個術語。錯誤消息是說在myEditPageViewController類中沒有名爲managedObjectContext的方法。

解釋你複製和粘貼代碼...

self.context = [self context]; 

//設置self.context的(一個@property NSManagedObjectContext *context該屬性的getter的價值。

//這是多餘的,因爲self.context等於self context] 我建議你查看setter和getter的教程,它們非常有用。

if (self.context == nil) 
{ 
self.context = [(myAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
} 

//此代碼是非常有用的,它會將您的NSManagedObjectContext到存儲在您的AppDelegate的managedObjectContext。

//到錯誤本身,這條線是多餘的。 NSManagedObjectContext * context = [self managedObjectContext]; 這會創建一個名爲context的本地實例變量,您應該只使用self.context的存儲@property

+0

感謝您的解釋 - 它真的幫助。很顯然,我對這些東西有了很好的理解還有很長的路要走 - 但是獲得者/制定者應該有所幫助。我的背景是編程,通常我會跳到項目中,然後飛到我的褲子的位置,直到我開始工作。 :)你通過解釋幫助了很多。 Achievelimitless從本質上講同樣的東西 - 但更加濃縮。我希望我可以將兩者都標記爲可接受的答案。 – Hanny

+1

您確實不應該調用應用程序委託來獲取託管對象上下文;相反,你應該把它傳遞給堆棧。謝天謝地,Apple終於把這個建議放到了他們的文檔中https://developer.apple.com/library/mac/documentation/DataManagement/Conceptual/CoreDataSnippets/Articles/stack.html#//apple_ref/doc/uid/TP40008283-SW1 – Abizern

+0

@Abizern .. Thanx的實物信息。我完全不知道這一點。我對此有一些疑問。我發佈了[這個問題](http://stackoverflow.com/questions/21050408/how-to-get-managedobjectcontext-for-viewcontroller-other-than-getting-it-from- ap)。請儘可能解釋。謝謝 –

1

首先,添加的代碼下面的行放在myEditPageViewController.h

@property(nonatomic, strong) NSManagedObjectContext *context; 

現在取代你在viewDidLoad中的代碼與此:

if (self.context == nil) 
{ 
self.context = [(myAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
} 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init]; 
NSManagedObjectContext *context = [self context]; //Not necessary 

讓我知道,如果它不能正常工作。正如我所提到的,你不需要寫最後一行,你可以直接引用self.context,而不是將其分配給其他變量

+0

謝謝 - 我希望我可以標記兩個答案 - 因爲你的和上面的一樣。他在解釋爲什麼某些事情會做他們所做的事情時有點廣泛 - 所以我給了他答案。不過,我給你的答覆是我可以做到的,因爲你的答案是濃縮而好的。 – Hanny

+1

您真的不應該調用應用程序委託來獲取託管對象上下文;相反,你應該把它傳遞給堆棧。謝天謝地,Apple終於把這個建議放到了他們的文檔中https://developer.apple.com/library/mac/documentation/DataManagement/Conceptual/CoreDataSnippets/Articles/stack.html#//apple_ref/doc/uid/TP40008283-SW1 – Abizern

+0

@Hanny ..無論如何,我也是第一個...... :) thnx。歡呼聲 –