我正在设置窗口的父属性,当我在windowDidLoad
中检查属性时,一切都很好。但是当我在IBAction
中检查时,它是零。我在这里缺少什么?
AppController.m
loginController = [[LoginController alloc] initWithWindowNibName:@"Login" owner:self];
loginController.parent = self;
[[loginController window] makeKeyAndOrderFront:self];
LoginController.h
@property (nonatomic, weak) AppController *parent;
LoginController.m @synthesize parent;
- (void)windowDidLoad
{
[super windowDidLoad];
NSLog(@"Parent: %@", self.parent); //<--- Parent: <AppController: 0xblahblah>
}
- (IBAction)login:(id)sender
{
NSLog(@"Parent: %@", self.parent); //<--- nil
}
答案 0 :(得分:2)
我认为你的问题只是你设置了错误的文件所有者,是保存xib文件的登录控制器,因此它绑定了所有IBOutlets和IBActions。
调用initWithWindowNibName:而不是initWithWindowNibName:owner :,以便文件所有者将是新创建的登录控制器,而不是应用程序控制器:
loginController = [[LoginController alloc] initWithWindowNibName:@"Login"];
修改
就像我怀疑的那样,你有两个独立的登录控制器实例,你认为只有一个。请参阅xib文件:
xib文件中的“Login Controller”对象创建了另一个登录控制器实例。它与您在app控制器中分配的实例不同。
解决方案是让父母成为IBOutlet:
@property (nonatomic, weak) IBOutlet AppController *parent;
要不在app控制器中分配它,它将自动从xib文件加载。 您所要做的就是将其绑定到xib文件中的登录控制器实例(如果文件所有者是app控制器,您应该将父属性拖动到对象图标,告诉我是否你遇到了一些问题)。这就是它打印null的原因:该操作由另一个对象处理,该对象没有初始化父属性。
答案 1 :(得分:1)
在viewDidLoad中,您可以访问名为parent
的iVar。
在登录时:您访问属性self.parent
。
这可以是相同的,也可以是不同的。
你有@synthesize
财产吗?如果是这样,没有任何其他选择?那你应该没问题。父和self.parent
应该是一回事。
你自动合成了吗?那没问题。但随后相应的iVar被称为_parent
。这意味着你必须有一个额外的ivar parent
,它不是同一个ivar。
将所有声明添加到您的问题中以获取更多详细信息。