View Controller вызывает awakeFromNib дважды

4 han [2010-11-11 12:21:00]

Я столкнулся с этой странной проблемой, и я не уверен, где я ошибаюсь.

Ситуация:

У меня есть класс MainWindowController, который будет загружать правильные перья, которые будут отображаться. Я создал объект и изменил его на класс MainWindowController в IB и поместил его в "MainWindowView" nib.

Таким образом, в основном у nib "MainWindowView" есть пользовательский вид и несколько кнопок сбоку, чтобы пользователь мог выбрать, какой вид загрузить, и он загрузит другой соответствующий nib. Я скрыл mainmenu во время запуска в IB, поэтому он загружает MainWindowView с другими файлами nib.

Однако при отладке, когда я помещал NSLog в MainWindowController awakeFromNib, я видел, что в консоли он вызывался дважды.

в моем проекте, у меня есть класс startupController вместе с MainMenu.xib со следующим кодом.

startUpController.h:

#import <Cocoa/Cocoa.h>
#import "MainWindowController.h"

@interface startupController : NSObject {
 MainWindowController *myWindowController;
}
@end

startUpController.m:

#import "startupController.h"
@implementation startupController
-(void)awakeFromNib {
 [super init];
 if(myWindowController == nil)
 myWindowController = [[MainWindowController alloc] initWithWindowNibName:@"MainWindowView"];
 [myWindowController showWindow:self];
}
@end

любая помощь приветствуется. спасибо.

objective-c cocoa


1 ответ


7 Решение Tyler Bindon [2010-11-11 18:25:00]

Похоже, вы создаете два объекта MainWindowController, поэтому awakeFromNib будет вызываться один раз для каждого.

Ваш awakeFromNib в методе startupContoller создает объект MainWindowController и инициализирует его с помощью элемента MainWindowView. Если вы также добавили объект к этому nib и задали его тип MainWindowController, другой объект MainWindowController будет создан при загрузке nib.

Вы должны удалить объект MainWindowController из элемента MainWindowView nib и вместо этого указать тип объекта File Owner для MainWindowController. (MainWindowController должен быть подклассом NSWindowController). Любые соединения, которые вы подключаете к созданному вами объекту, должны быть подключены к файловому владельцу.

Кроме того, вы не должны вызывать [super init] в awakeFromNib. Вы должны только вызывать [super init] в методе init.