从另一个类方法更新UI - Cocoa

时间:2011-02-22 18:06:15

标签: objective-c cocoa macos user-interface

我想从AppDelegate更新我的应用程序中的UI,但只要我这样称呼它:

Controller *object = [[Controller alloc] init];
[object methodHere];

似乎没有更新UI。我在这做错了什么?我已经放入一个NSLog来查看它是否被调用,它是。 Here是一个显示错误的示例项目。

编辑:有人可以告诉我要改变我提供的项目的内容。我只是不知道在我的项目中键入什么,以便我可以从另一个类更改简单NSTextField的值。

3 个答案:

答案 0 :(得分:9)

当您编写[[Controller alloc] init]时,您无法访问笔尖中的Controller对象。您正在创建一个新的Controller对象,它与应用程序中的任何其他对象无关。

请记住,每个Controller对象都不一样,每个NSArray都是相同的。仅仅因为你在你的笔尖中创建了一个连接到NSTextField的控制器并不意味着你刚创建的一些随机控制器共享控制器的连接。

您需要做的是给代表一个对笔尖中的控制器的引用。

答案 1 :(得分:4)

这很简单,Chuck的评论基本上解释了你需要做什么,但我会为你明确列出代码。在testAppDelegate.h

@interface testAppDelegate : NSObject <NSApplicationDelegate> {
    NSWindow *window;
    // You can make an IBOutlet to any kind of object you
    // want; it's just a way for you to get a reference
    // in code to an object that has been alloc'd and
    // init'd already by the xib mechanism.
    IBOutlet Controller *controller;

}

然后进入InterfaceBuilder中的xib并将Test App Delegate对象的出口连接到Controller对象(这些对象已存在于xib中)。

testAppDelegate.m

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    // This is the key:
    // _Don't_ alloc/init a new controller object. The 
    // objects in your xib are allocated and initialized 
    // by virtue of being in that file. You just need to 
    // give your AppDelegate a pointer to it, as above.
    [controller setTextValue:@"hello"];
}

答案 2 :(得分:3)

它被称为可以,但它没有连接到界面。应该在appDelegate.h文件中定义某种视图控制器,而不是在该对象上调用该方法。

更新详情: 你可以解决这个问题的一种方法是在最初创建控制器时简单地保存控制器(并且直到稍后才释放它。)

只需将您自己的控制器对象放入.h文件

即可
Controller* myController;

当您创建要转换到的新视图控制器时,只需将myController设置为引用该对象,稍后当您想要更新UI时,只需调用

即可。
[myController methodHere];

有点笨拙,但它确实有效。当你完成那个视图时,不要忘记释放myController。

我建议调查的另一个想法是改变你传递给代表的方法。也就是说,而不是将方法作为

-(returnType)callDelegateToDoSomething;

将其放入

-(returnType)callDelegateToDoSomething:(id) sender;

您以相同的方式调用新方法,但您的控制器应自动将其自身作为参数传递。然后,在方法内部,只需使用

[sender methodHere];

它应该有用。 (你可能需要稍微玩一下。我不是代表或发送者论证的专家,但值得一试。)