Разработка Mac Разработка базового интерфейса - PullRequest
2 голосов
/ 15 декабря 2011

Я перебираю несколько примеров банков кода и учебных пособий и просто спотыкаюсь, во многом это связано с тем, что эти учебные пособия написаны для Xcode <4.2 и ARC меняет несколько вещей. </p>

Я пытаюсь создать интерфейс с шаблоном проектирования MVC. Я использую базовый шаблон, предоставленный для делегата приложения. Я добавил класс с именем MainWindowController, который наследуется от NSWindowController. В Интерфейсном Разработчике сначала я удалил объект Window в nib-файле MainMenu (потому что я хочу его в отдельном файле). Я создаю новый интерфейс с именем MainWindow (.xib), меняю владельца файла на MainWindowController и добавляю делегата в список объектов. Сейчас что-то не щелкает.

Я не совсем понимаю, как или что мне нужно реализовать, чтобы делегат по существу загрузил и запустил оконный контроллер. Сначала я попытался связать выход «делегата» в окне с реальным делегатом приложения (называемый AppDelegate), а затем связал выход окна в классе «Делегат» с окном в Interface Builder.

Я хотел бы получить ответ на этот вопрос, но я был бы гораздо более доволен правильной документацией, описывающей этот процесс. Я уверен, что на MacDev что-то есть, но у меня проблемы с его поиском.

Вот с чем я работаю:

  @class MainWindow;

  @interface AppDelegate : NSObject <NSApplicationDelegate>


  @property (strong) MainWindow *mainWindowController;
  @property (assign) IBOutlet NSWindow *window;

  @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
  @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
  @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;

  - (IBAction)saveAction:(id)sender;

  @end

...

  @implementation AppDelegate

  @synthesize window;
  @synthesize mainWindowController;
  @synthesize persistentStoreCoordinator = __persistentStoreCoordinator;
  @synthesize managedObjectModel = __managedObjectModel;
  @synthesize managedObjectContext = __managedObjectContext;

  - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
  {
      MainWindow *controller = [[MainWindow alloc] initWithWindowNibName:@"MainWindow"];
      mainWindowController = controller;

     // ... the rest handles the ManagedObject Models...

Решение на сегодняшний день:

@synthesize mainWindowController = _mainWindowController; // IBOutlet is linked in IB
//...
- (void) applicationDidFinishLaunching: (NSNotification *) aNotification
{
    //... initialization of event handling etc...
    if ( !_mainWindowController ) _mainWindowController = [[ MainWindowController alloc] initWithWindowNibName:@"MainWindow"];
    [_mainWindowController showWindow: self];
    // ...

Делегат приложения может управлять NSWindow в главном файле пера или может делегировать эту задачу контроллеру (NSWindowController), что типично для приложений на основе документов или шаблонов проектирования MVC. Файл пера по умолчанию, указанный в Basic-info.plist, определяет, какой файл пера загружается. Как правило, пером по умолчанию должно быть главное меню, которое также загружает делегата. Затем делегат должен с помощью applicationDidFinishLoading: или awakeFromNib: выполнить инициализацию контроллеров и продолжить соответствующее делегирование в соответствии с шаблонами проектирования делегирования и mvc.

Основная проблема, с которой я столкнулся, - это запуск окна, что делает showWindow:. Обострение этой проблемы связано с исходным кодом из очень старого проекта Mac OS X, который использовал устаревшие функции и методы для выполнения делегирования и привел меня на неверный путь. Спасибо за ответ, в конечном итоге это заставило меня искать правильные вопросы в нужном месте, и я нашел правильный ответ.

1 Ответ

1 голос
/ 16 декабря 2011

Ваша проблема в том, что во втором xib, "MainWindow", создается новый AppDelegate объект, который абсолютно не имеет ничего общего с объектом AppDelegate в xib "MainMenu".Объекты в каждом xib - это реальные объекты, которые сериализуются и затем загружаются во время выполнения.

Эта конкретная проблема будет рассмотрена в Руководстве по управлению ресурсами, «Загрузка пера» .Я также могу предложить «Базовый дизайн приложения» .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...