【问题标题】:View not updating when a message is sent to its view controller将消息发送到视图控制器时视图不更新
【发布时间】:2012-11-08 21:44:05
【问题描述】:

当来自另一个类的消息发送到ViewController 时,我在更新视图时遇到问题。

基本上,我有一个带有单个窗口的应用程序,其中不同的自定义视图将被换成另一个。我有一个 AppController 类来管理这个并且工作正常:

@interface AppController : NSObject

@property (weak) IBOutlet NSView *ourView;
@property (strong) NSViewController *ourViewController;

- (IBAction)changeView:(id)sender;
- (IBAction)start:(id)sender;
- (void)changeViewContoller:(NSInteger)tag;

@end

当一个新视图被换成另一个视图时,ourViewController 属性将更新为指向该视图的控制器类。每个视图控制器类都会有一个方法都命名为相同的东西,例如“action”。这个方法应该改变视图上的一些东西。

因此AppController 类中的“start”方法将调用ourViewController 属性的“action”方法。为此,我使用了objc_msgSend() 方法:

objc_msgSend(self.ourViewController, action);

这是视图控制器类定义:

@interface CountdownViewController : NSViewController

@property (weak) IBOutlet NSTextField *label;

- (IBAction)changeLabel:(id)sender;
- (void)start;
@end

我在每个ViewController 的“action”方法中放置了一个NSLog(),以查看它是否有效,并且确实有效,但是“action”方法也应该更改标签的字符串值,但它才不是。如果有人知道为什么视图没有更新,那将非常有帮助。谢谢!

【问题讨论】:

    标签: objective-c xcode cocoa model-view-controller


    【解决方案1】:

    观点被弱化了? 如果您需要在此类中保留该指针,请尝试使其变得强大

    顺便说一句:..你为什么还要 objc_msgsend.. 使用 performSelector

    【讨论】:

    • 我通过帖子编辑以显示视图控制器定义。我也将 objc_msgsend 更改为 performSelector,但并没有什么不同。
    • 观点很弱......所以我再次问:它是否在其他地方举行?否则,恕我直言,即使它是 ViewController 的视图,它也可能会消失 :)
    • 不,我不认为它被其他任何东西持有。让它变得强大可以解决这个问题吗?
    • 是的,当它没有被持有时,视图的消息会变为 nil...你可以在调试器中设置一个断点
    • 我把它改成了strong,但还是没有运气...我设置了一个断点,虽然我不确定它是什么意思。看起来它没有连接到标签:_label NSTextField * 0x0000000000000000。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 2014-03-28
    相关资源
    最近更新 更多