MouseUp和NSArrayController

时间:2008-12-09 06:10:32

标签: cocoa

如何将-mouseUp:事件与NSArrayController的-add:方法相关联? -mouseUp:事件存在于另一个对象中,但在保存受控阵列的对象中进行#import编辑和实例化。

通常,使用NSButton命令 - 从按钮拖动到NSArrayController的-add:方法,但显然这对于​​鼠标事件是不可能的。

- 增加内容 -
MATT:感谢您的回答,并在第一次阅读时有意义。作为Obj-C / Cocoa的初学者,使用程序和非GUI语言(嵌入式控制器的PLM51和C51)背景,我很难掌握IBOutlets的实际实现和连接。我没有按钮之类的问题(即IB中可见的东西),但这是我理解的:我需要在myDocuments.h文件中声明-IBOutlet NSArrayControler * arryCtrl;。现在请记住,我覆盖-mouseUp方法的对象叫做Canvas,而在myDocuments.h中我有一个Canvas * canvas声明,因此我在运行时有myDocument实例化的canvas对象。在IB中,我从File的所有者(myDocument右)拖动到ArrayController,并建立一个链接但不是-add:,因为该选项不可用。在nib(myDocument)中没有Canvas的对象 但是,在mouseUp(canvas方法)中,如果我向IBOutput发送消息,即[arrayCtrl add:self] arrayCtrl未知。

无论如何,我确定你们都在傻笑,因为答案可能很明显。但是,我真的想要了解这一切,并意识到问题是我的新手编码。谢谢你指出这个新手正确的方向

2 个答案:

答案 0 :(得分:2)

在你的mouseUp:方法覆盖的类中,你需要有一些方法来引用NSArrayController。这通常是通过IBOutlets完成的。因此,在类中创建一个插座并将其连接到IB中的阵列控制器。这样,您可以在mouseUp:方法中执行任何操作:

- (void)mouseUp:(NSEvent *)theEvent
{
    [arrayControllerOutlet add:self];
}

答案 1 :(得分:2)

这里的典型模式是让您的控制器成为canvas对象的委托。在创建画布时,您还会向其发送setDelegate:self消息。

然后,您可以使用一些消息定义您的委托协议:

@protocol MyCanvasProtocol
@optional
-(void)canvas:(Canvas *)canvas mouseUp:(NSEvent *)event;
-(void)canvas:(Canvas *)canvas objectSelected:(id)theObject;
@end

然后在画布的-mouseUp:方法中,您只需将相应的消息发送到画布'委托。

- (void)mouseUp:(NSEvent *)event {
    // some mouse up code

    if ([delegate respondsToSelector:@selector(canvas:mouseUp:)])
        [delegate canvas:self mouseUp:event];
}

以这种方式构建代码允许您轻松地在其他地方重用该Canvas对象,而不是将其绑定到Controller的实现中。然后,您的控制器可以以任何方式自由地在画布上创建所需的任何对象。