2015-09-06 58 views
-2

我參與了這個問題三類:實例不存儲值

  1. 我的appDelegate
  2. 我的數據類
  3. 我對我的ViewController類

當我的應用程序啓動我用的是在我的應用程序委託中,使用didFinishLaunchingWithOptions方法創建數據類的實例,然後調用queryMessagesFromBackend方法填充我的消息數組。

然後在我的視圖控制器中,我創建了我的數據類的另一個實例,以訪問我剛剛填充的消息數組(dataClass.messages),但是它是空的。這沒有意義,因爲當調用該方法時,它會記錄消息數組所具有的所有數據。爲什麼我的新實例顯示消息數組是空的?

我會提供代碼,但似乎沒用

+0

你期望數據類的兩個獨立實例中的'messages'數組是相同的嗎? – stevesliva

+0

是的,我做到了。我猜這是錯誤的方法 – icscott

+0

你的數組是從你的數據類的伊娃嗎?在控制器之間共享這個實例的最好方法是使用單例 –

回答

0
  1. 在你的「應用程序代理」做第一個「數據類」對象「的應用程序代理」的伊娃(或財產)
  2. 聲明一些吸氣劑爲數據對象在應用程序委託類中。
  3. 在你的視圖控制器 - 通過共享NSApp實例獲取應用程序委託。
  4. 從引入的getter獲取來自應用程序委託的共享數據對象。

提示:U可以使用一個接口(協議)爲使事情少許清潔劑:

@protocol XYZDataProvider <NSObject> 
- (XYZDataClass *) data; 
@end 

... 

@interface XYZAppDelegate : NSAppDelegate <XYZDataProvider> { 
    XYZDataClass *data; 
} 

@end 

... 

@implementation XYZAppDelegate 

// either can init data in didFinishBlahBlahBlah... 

- (void) did ... { 
    self->data = [XYZDataClass new]; 
    ... 
} 

// implement protocol's required method 
- (XYZDataClass *) data { 
    /// and then return on request... 
    return self->data; 

    // or do so-caled lazy-loading: 

    // if (!self->data) { 
    //  $self->data = [... ..]; 
    //  ... 
    // } 
    // return self->data; 
} 

@end 

... 

@implementation XYZViewController 

- (void) processData { 
    NSAppDelegate *appDelegate = [NSApp delegate]; 
    if ([appDelegate conformsToProtocol:@protocol(XYZDataProvider)]) { 
     XYZDataClass *data = [(id<XYZDataProvider>)appDelegate data]; 

     // do smth with data 
     ... 

    } 

    ...  
} 

@end 

注:代碼包含錯誤(直接在瀏覽器中寫...)