2

我正在为一个窗口设置父属性,当我签入该属性时windowDidLoad,一切都很好。但是当我检查它时IBAction,它是零。我在这里想念什么?

应用控制器.m

loginController = [[LoginController alloc] initWithWindowNibName:@"Login" owner:self];
loginController.parent = self;
[[loginController window] makeKeyAndOrderFront:self];

登录控制器.h

@property (nonatomic, weak) AppController *parent;

LoginController.m @synthesize 父级;

- (void)windowDidLoad
{
    [super windowDidLoad];

    NSLog(@"Parent: %@", self.parent); //<--- Parent: <AppController: 0xblahblah>
}

- (IBAction)login:(id)sender
{
    NSLog(@"Parent: %@", self.parent); //<--- nil
}

在此处输入图像描述在此处输入图像描述在此处输入图像描述在此处输入图像描述在此处输入图像描述

4

2 回答 2

2

我认为您的问题只是您设置了错误的文件所有者,是保存 xib 文件的登录控制器,因此它绑定了所有 IBOutlets 和 IBActions。

调用 initWithWindowNibName: 而不是 initWithWindowNibName:owner: ,这样文件所有者将是新创建的登录控制器,而不是应用程序控制器:

loginController = [[LoginController alloc] initWithWindowNibName:@"Login"];

编辑

就像我怀疑的那样,您有两个单独的登录控制器实例,而您认为只有一个。查看 xib 文件:

在此处输入图像描述

xib 文件中的该对象“登录控制器”创建另一个登录控制器实例。它与您在应用程序控制器中分配的实例不同。

解决方案是让 parent 成为 IBOutlet:

@property (nonatomic, weak) IBOutlet AppController *parent;

并且不要在应用程序控制器中分配它,它将自动从 xib 文件中加载。您所要做的就是将它绑定到 xib 文件中的登录控制器实例(如果文件所有者是应用程序控制器,您应该 ctrl-拖动父属性到对象图标,告诉我您是否遇到问题) . 这就是它打印 null 的原因:该操作由另一个对象处理,该对象尚未初始化 parent 属性。

于 2013-03-11T21:27:10.550 回答
1

在 viewDidLoad 中,您访问一个名为 的 iVar parent。在登录中:您访问该属性self.parent。这可以是相同的,也可以是不同的。

@synthesize有财产吗?如果是这样,没有任何额外的选择?那你应该没事。父母和self.parent应该是同一件事。

你是自动合成的吗?那没问题。但随后会调用相应的 iVar _parent。这意味着你必须有一个额外的 ivar parent,它不是同一个 ivar。

将所有声明添加到您的问题中以获取更多详细信息。

于 2013-03-11T20:45:24.513 回答