我对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秒时触发动画。
答案 0 :(得分:1)
在-init
个对象中,Interface Builder连接尚未设置,加载机制无法在初始化对象之前设置它们。
相反,您想要覆盖-awakeFromNib
方法,如下所示:
- (void)awakeFromNib {
[[self otherClassInstance] printMessage];
}
保证在建立连接后调用 -awakeFromNib
。根据具体的实现,您可能还需要防止执行两次的代码,例如通过在该方法中检查/设置的布尔实例变量didWake
。