从块内部向实例方法发送消息

时间:2014-08-23 19:49:53

标签: objective-c cocoa block message self

我对Cocoa编程比较陌生。基本上,我想在我的Document类中的方法中向一个强烈的类(继承自NSView)发送一条消息,我已将其初始化为Document类的@interface中的属性。

以下是简化版:

///////////////////////////KOZDocument.h///////////////////////////
#import <Cocoa/Cocoa.h>
#import "KOZOtherClass.h"


@interface KOZDocument : NSDocument

@property (assign) IBOutlet KOZOtherClass *otherClassInstance; //this would be connected to the relevant CustomView in the IB

@end

///////////////////////////KOZDocument.m///////////////////////////

#import "KOZDocument.h"

@implementation KOZDocument

- (id)init
{
    self = [super init];
    if (self) {
        // I want to send a message to otherClassInstance from some method e.g. init
        NSLog(@"INITIALISING");
        [[self otherClassInstance] printMessage];// this is the message I want to work but which doesn't (even though i don't any errors)

    //sending the message to a locally initiated instance works but I don't want to use a local instance because i want to connect it to a CustomView in IB
        KOZOtherClass *otherClassLocalInstance = [[KOZOtherClass alloc] init]; 
        [otherClassLocalInstance printMessage];
    }
    return self;
}

//.….

///////////////////////////KOZOtherClass.h///////////////////////////


#import <Foundation/Foundation.h>

@interface KOZOtherClass : NSView

- (void) printMessage;

@end

///////////////////////////KOZOtherClass.m///////////////////////////


#import "KOZOtherClass.h"

@implementation KOZOtherClass

- (void) printMessage{
    NSLog(@"This method can be called!!");
}

@end
/////////////////////////////////////////////////////////////////////

相同的方法适用于所有本机Cocoa对象,但不适用于我的。

谁能告诉我我做错了什么?

以下是我想要这样做的背景:

我正在构建一个使用AVFoundation播放视频的应用。当播放到达视频中的特定部分时(例如2秒后),我想要在NSView中触发动画。我正在调整Apple的AVSimplePlayer并使用时间观察器来获得播放头的位置。时间观察者在每个给定的时间间隔内执行块内的代码。在这个块中,我想向动画视图发送一条消息,以便在时间超过5秒时触发动画。

1 个答案:

答案 0 :(得分:1)

-init个对象中,Interface Builder连接尚未设置,加载机制无法在初始化对象之前设置它们。

相反,您想要覆盖-awakeFromNib方法,如下所示:

- (void)awakeFromNib {

    [[self otherClassInstance] printMessage];
}
保证在建立连接后调用

-awakeFromNib。根据具体的实现,您可能还需要防止执行两次的代码,例如通过在该方法中检查/设置的布尔实例变量didWake