【问题标题】:array from model-class return NULL来自模型类的数组返回 NULL
【发布时间】:2013-02-04 22:08:54
【问题描述】:

如何从我的NSWindowController 中的模型类调用数组? valueArray 在 AppDelegate 中设置为模型类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;
}

@implementation ResultWindowController
@synthesize resultAverage;
...

- (IBAction)pushChange:(NSButton *)sender
{
    [self calculateAverage];
    [_outputLabel setDoubleValue:[resultAverage doubleValue]];
    NSLog(@"resultAverage is:%@", resultAverage);
    NSLog(@"vi.valueArray is:%@", vi.valueArray);
}

-(void)calculateAverage
{
    resultAverage = [vi.valueArray valueForKeyPath:@"@avg.nomValue"];
}

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

【问题讨论】:

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


    【解决方案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 时。然后,您可以删除在 RootWindowController 中声明的 vi ivar(因为您可以直接访问应用程序委托中的那个)。

    实际上,最好创建一个单独的类作为模型。它可能是一个单例,你可以像这样访问它:

    ValueItem *vi = [MyModel sharedModel].vi;
    

    更具可读性和简洁性。

    【讨论】:

    • 你好,sergio,对不起,我对所有这些东西还是陌生的。我只是想用ValueItem *vi 我只是让模型可以访问而不创建不同的模型。我如何才能真正访问ValueItem 的同一个实例,还是需要其他策略?
    • 太棒了!非常感谢!它有效,但你能告诉我为什么[rwc setVi:self-&gt;vi];' prevent creating a new and independent from ValueItem`?
    • 很高兴能帮上忙。不幸的是,我不明白你在问什么......
    • 对不起我的错。我不明白如何在ResultWIndowsController 中创建ValueItem 的第二个实例?我又不[... alloc]init]]了?
    • 你不会在 RootWindowController 中这样做,而是在你的模型中这样做。那么你的模型应该支持vi(一个数组?)的多个值,如果你添加更多你想要做的事情,它会有所帮助......
    猜你喜欢
    • 1970-01-01
    • 2019-10-18
    • 2013-10-24
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    相关资源
    最近更新 更多