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.