模型类中的数组返回NULL

时间:2013-02-04 22:08:55

标签: objective-c macos model-view-controller

如何从NSWindowController中的模型类调用数组? {1}在AppDelegate中设置为模型类valueArray

ValueItem

@interface AppDelegate : NSObject <NSApplicationDelegate>
{
    ValueItem *vi;
    ResultWindowController *rwc;
    IBOutlet NSArrayController *outArrayController;
}

调用@implementation AppDelegate .... - (IBAction)pushOk:(NSButton *)sender { self->vi = [[ValueItem alloc]init]; [vi setValueArray:[outArrayController arrangedObjects]]; NSLog(@"vi.valueArray is:%@", vi.valueArray); if (rwc) { [rwc close]; } rwc = [[ResultWindowController alloc] init]; [rwc setShouldCascadeWindows:NO]; [rwc showWindow:self]; } 返回数组内容就好了。但是,当我尝试在我的其他NSLog(@"vi.valueArray is:%@", vi.valueArray);中使用它时,它始终返回NSWindowController

NULL

@interface ResultWindowController : NSWindowController
{
    ValueItem *vi;
    NSNumber *resultAverage;
}

我找不到丢失的链接?我在这里想念什么? 谢谢!

1 个答案:

答案 0 :(得分:1)

您的两个班级中有两个独立且无关的ValueItem *vi个实例。这就解释了为什么你在第一堂课中设置它,但在第二节vi仍然是nil

你应该能够通过这样做来解决它:

rwc = [[ResultWindowController alloc] init];
[rwc setVi:self->vi];                // <--- this
[rwc setShouldCascadeWindows:NO];
[rwc showWindow:self];

为了做到这一点,你应该在RootWindowController中定义一个合适的setter方法。

或者,如果您想让AppDelegate充当模特,您可以这样做:

ValueItem *vi = [(AppDelegate*)[UIApplication sharedApplication].delegate vi];

当您需要访问vi时。然后,您可以删除vi中声明的RootWindowController ivar(因为您可以直接访问应用代理中的那个)。

实际上,创建一个充当模型的单独类会更好。它可能是一个单身人士,您可以像这样访问它:

ValueItem *vi = [MyModel sharedModel].vi;

更具可读性和简洁性。