如何将-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未知。
无论如何,我确定你们都在傻笑,因为答案可能很明显。但是,我真的想要了解这一切,并意识到问题是我的新手编码。谢谢你指出这个新手正确的方向
答案 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的实现中。然后,您的控制器可以以任何方式自由地在画布上创建所需的任何对象。