我有一个应用程序打算在单击按钮时创建一个弹出窗口。弹出窗口将从nib文件加载。因此,单击按钮,窗口会愉快地弹出。但是,它的awakeFromNib方法被调用两次。这是代码;
申请代表:
...
-(IBAction)myButton:(id)sender{
printf("[settings]: button pressed\n");
Config_SelectorSetup *selectorSetup = [[Config_SelectorSetup alloc] initWithWindowNibName:@"Config_SelectorSetup"];
printf("about to load\n");
[[selectorSetup window] makeKeyAndOrderFront:sender];
}
Config_SelectorSetup.m
- (id) initWithWindowNibName:(NSString *)windowNibName{
printf("[initWithWindowNibName]\n");
if( self = [super initWithWindowNibName:windowNibName] ){
...
}
return self;
}
- (void)awakeFromNib{
printf("[awakeFromNib]\n");
[self startScreen];
}
这是输出:
[settings]: button pressed
[initWithWindowNibName]
about to load
[awakeFromNib]
[awakeFromNib]
分析调用堆栈,第一次由[NSObject performSelector:]
调用第二个[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:]
。
有人能说出我做错了什么吗?
由于
答案 0 :(得分:3)
Config_SelectorSetup.xib
除文件所有者外还包含Config_SelectorSetup
个对象吗?
尝试在self
-
awakeFromNib
NSLog(@"self = %p", self);
每次都打印相同的地址吗?如果它正在打印不同的地址,则您的笔尖中可能有Config_SelectorSetup
个对象。
答案 1 :(得分:0)
您的课程中有多少个出口,该课程的子课程是什么?我找到了某些子类(例如NSDocument
),如果连接了多个出口,则每个nib对象将在加载时触发awakeFromNib
方法。 NSLog
您的网点,看看他们输出的是否为零或地址。