财产在IBAction中失去价值

时间:2013-03-11 20:05:24

标签: objective-c cocoa

我正在设置窗口的父属性,当我在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
}

enter image description here enter image description here enter image description here enter image description here enter image description here

2 个答案:

答案 0 :(得分:2)

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

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

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

修改

就像我怀疑的那样,你有两个独立的登录控制器实例,你认为只有一个。请参阅xib文件:

enter image description here

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。

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