Я разрабатываю для iPhone, и у меня есть класс DataManager
, который используется для хранения данных моего приложения. Когда приложение запускается / завершается, данные считываются / записываются на диск для создания экземпляра этого класса с использованием классов NSKeyedArchiver (и Unarchiver), поскольку DataManager придерживается протокола NSCoding.
Одна из проблем, с которыми я сталкиваюсь, заключается в том, что DataManager должен быть доступен для многих других моих классов IB, поэтому он определяется как объект в IB, и у этих классов есть выход. DataManager создается с использованием стандартного метода init: (или, возможно, initWithCoder :?), но, поскольку IB не имеет подходящего файла (или NSData из файла) для создания экземпляра объекта, он не имеет исходного содержимого.
Итак, есть ли способ сказать IB , а не , о создании экземпляра класса автоматически? Вместо этого это будет выполняться с использованием моего делегата приложения, что-то вроде:
AppDelegate.h
IBOutlet DataContext *context;
AppDelegate.m
context = [NSKeyedUnarchiver unarchiveObjectWithData:dataLoadedFromFile];
Как видите, это представляет проблему. Разве контекст не будет создан дважды, один раз InterfaceBuilder, затем второй раз моим делегатом приложения?
Я бы хотел предотвратить сохранение контекста в качестве ивара в делегате, так как это, похоже, отклоняется от парадигмы MVC и вместо этого склоняется к одноэлементному шаблону. (Контролер не должен нести ответственность за данные в моем уме. Он, очевидно, может поддерживать ссылку на них, но не должен отвечать за предложение их другим классам.)