2015-09-06 2 views
-2

У меня есть три класса, участвующих в этой задаче:Instance не сохраняет значение

  1. мой AppDelegate
  2. мой класс данных
  3. мой мой класс ViewController

, когда мое приложение запускает я использую didFinishLaunchingWithOptions в моем делете делегата для создания экземпляра класса данных, а затем вызвать метод queryMessagesFromBackend для заполнения моего массива сообщений.

Тогда в моем контроллере просмотра я создаю еще один экземпляр класса данных для доступа к массиву сообщений (dataClass.messages), который я только что заполнил, но его пустой. Это не имеет смысла, поскольку при вызове метода он регистрирует все данные, которые имеет массив сообщений. Почему мой новый экземпляр показывает, что массив сообщений пуст?

Я хотел бы предоставить код, но это кажется бесполезным

+0

Вы ожидаете, что массив 'messages' в двух отдельных экземплярах класса данных будет таким же? – stevesliva

+0

да я сделал. Im предположение, что неправильный подход – icscott

+0

ваш массив является ivar из вашего класса данных? Лучший способ поделиться этим экземпляром между контроллером - использовать одноэлементный –

ответ

0
  1. В вашем «приложении делегат» сделать первый «класс данных» объект в Ивар (или свойство) «приложение делегат»
  2. Объявить некоторый геттер для этого объект данных в классе делегата приложения.
  3. В вашем контроллере представления - получите делегат приложения через общий экземпляр NSApp.
  4. Получить общий объект данных из делегата приложения с введенным получателем.

Совет: 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 

Примечание: код содержит ошибки (написанные непосредственно в браузере ...)

Смежные вопросы