【问题标题】:Cocoa: loading a view from within the NSViewController classCocoa:从 NSViewController 类中加载视图
【发布时间】:2011-12-25 06:07:27
【问题描述】:

据我了解,必须先加载 NSViewController 类的视图,然后才能通过 setter 和 getter 在视图中更改任何内容。问题是,控制器中的视图应该显示倒计时,因此视图控制器类有一个 NSTimer,它会每秒更改一个 stringValue。但据我所见,我必须使用类似的东西:

[instanceOfViewControllerClass view] 在另一个类中,以便加载视图,然后 setStringValue 可以工作。

我之前问过类似的问题,但答案就是我上面所说的,当时我不知道我必须不断改变观点。

基本上我正在寻找的是这样的东西:

//ViewControllerClass.m
-(void)startCountdown{
//here I make "invocation" using NSInvocation
[invocation setTarget:self];
[invocation setSelector:@selector(updateCountdown)];
timerLabelUpdater = [NSTimer timerWithTimeInterval:1 invocation:invocation repeats:YES];
}

-(void)updateCountdown {
//x would be calculated here by deducting 1 from an original amount of time
[timeLeftLabel setStringValue:@"x"];
}

一切正常,如果我将 NSLog 放在 updateCountdown 中,它会完美记录,这意味着它正在运行,我只是无法更改标签。

使用上面的答案,我尝试在上面代码的几个地方使用[self view][self loadView],但它们都没有任何区别。

我希望这次我已经清楚我在寻找什么,任何帮助将不胜感激。

【问题讨论】:

    标签: cocoa nsviewcontroller loadview


    【解决方案1】:

    你是如何初始化视图控制器的?它是存档在笔尖中,还是您在代码中执行?我认为您实际上并没有告诉它它与哪个笔尖相关联。

    如果它是笔尖的一部分,您需要在属性检查器中设置正确的笔尖名称字段。

    如果你在代码中实例化它,你需要明确告诉它它的 nib 的名称是什么。

    最简单的方法是像这样覆盖init

    - (id)init {
        self = [super initWithNibName:@"MyViewController" bundle:nil];
        if (self) {
            // Initialization code here.
        }
        return self;
    }
    

    【讨论】:

    • 什么都没发生,我正在使用 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { } return self;} 我猜这并没有什么不同。
    • 您是在代码中创建视图控制器吗?或者你有它在某个地方的笔尖吗?如果你有一个笔尖,你需要为它分配一个笔尖名称。
    • 我刚刚添加了 NSViewController 类,nib 中什么都没有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 2014-12-24
    相关资源
    最近更新 更多