2013-03-03 150 views
0

這是一個陳舊的問題,我有一些編程經驗,但Objective-c對我來說是全新的,我無法找到任何明確的定義整個客觀C的概念。這裏有一些我已經知道的理論:我不能直接訪問類的實例變量,因此我必須使用屬性或「訪問器方法」來訪問它。好的。我嘗試了一些我的意思是通過訪問方法,但嗯,這是全部錯誤。我想你可以幫我弄清楚這一點。如何訪問AppDelegate.m中的某些實例類變量

這裏是我的例子: 我有階級貓和一個有關貓的信息的plist。 Plist存儲寵物的名稱和年齡。我想做這個:簡單的看法,有textField,標籤和一個按鈕。標籤 - 是一個當前的寵物名稱,textField用於更改在textfield now方法中的貓名稱(更改貓的名字聽起來令人毛骨悚然,但這只是一個示例),以及一個將消息發送到更改名稱函數的按鈕。在我按下主頁按鈕後,我想通過AppDelegate.m文件將名稱保存到文件中,這是一個問題,我將在下面介紹。

我不知道如何將代碼封裝到隱藏區域,直到您打開它,所以我不想在這裏用大量的代碼行打擾您的眼睛。我添加一個鏈接到代碼和一些日誌輸出的屏幕。 (如果有人會說我怎麼能做到這一點,我會在這裏添加代碼),但現在這裏是鏈接: http://shlonger.com/680dc6cf21aa426c4bed107213ab4467

我無法訪問應用程序工作時實現的對象,來自AppDelegate。我爲類變量創建了一些屬性和一些getter/setter方法,但是當我在AppDelegate中初始化Cat類時,它又創建了另一個具有默認設置(如plist文件)的對象。如何通過正確的方式通過AppDelegate保存當前設置?

對不起,有很長的問題描述。

+0

發佈代碼是獲得幫助的最佳方式之一。一些提示,如果您知道具體方法中的問題,請發佈該方法,並使用**相關**錯誤消息。如果我們需要更多,我們會讓你知道。 – 2013-03-03 21:40:16

+0

如果我理解正確,你想在應用程序進入後臺時保存你的Cat類。 – 2013-03-03 21:42:09

+0

@MikeD嗯我真的沒有理解你,但如果你想在這裏的代碼,我可以發佈它,這不是一個問題,如果你對我的問題有問題,我準備回答所有的問題:) – 2013-03-03 21:43:32

回答

3

您不一定需要與AppDelegate通信,但您可以通過[[UIApplication sharedApplication] delegate]。然後,您可以訪問你需要什麼都特性,但你會probabaly需要轉換它:

// assuming your application delegate is of type 'AppDelegate' - usually the default provided by Xcode 
AppDelegate *delegate = (AppDelegate*)[[UIApplication shared application] delegate]; 
// you can now all you application delegat's properties. 

另一種方法,在你的Cat類,是爲notifications posted by the app delegate註冊。例如:

@implementation Cat 

-(id)init { 
    if ((self = [super init])) { 
     // you can also attempt to read stored values form disk here 
     // perform all your other initialization that you already have 

     [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(handleNotification:) 
                name:UIApplicationDidEnterBackgroundNotification 
                obect:[UIApplication sharedApplication]; 
    } 
} 

在你Cat類,定義了一個方法handleNotification:,因爲這是提供給通知中心選擇器。這是該方法時UIApplicationDidEnterBackgroundNotification張貼通知中心將在您的Cat類致電:

-(void)handleNotification:(NSNotification*)notification { 
    NSString *name = notification.name; 
    id sender = notification.object; 

    if ([name isEqual:UIApplicationDidEnterBackgroundNotification] && [sender isEqual:[UIApplication sharedApplication]) { 
     // save `Cat` class to disk as plist or however you want 
    } 
} 

你也可以用UIApplicationWillResignActiveNotification替代UIApplicationDidEnterBackgroundNotification。我會把它留給你決定哪個最適合你的需求。

More on using the NSNotificationCenter

UPDATE

第二種方法的優點是沒有必要爲您的Cat類和應用程序代理之間的任何specfic知識或扶養。兩個對象都可以獨立運行。 [UIApplication sharedApplication]是可用於在iOS應用程序中運行的任何對象的單例,但您不需要知道確切的類型。所需的唯一具體知識是通知名稱,但即使是全球通用名稱也是如此。

+0

我正在嘗試第一種方法。錯誤發生在Xcode中,所以這將修復錯誤'AppDelegate *委託=(AppDelegate *)[[UIApplication sharedApplication]委託];' – 2013-03-03 22:21:46

+0

@flinth查看我的更新。 – 2013-03-03 22:26:59

+0

哦,謝謝邁克,這對我很有幫助。我不知道它現在如何工作,但我肯定會學到它。 – 2013-03-03 22:39:35