gpt4 book ai didi

cocoa - NSView 子类如何与 Controller 通信?

转载 作者:行者123 更新时间:2023-12-03 16:05:07 25 4
gpt4 key购买 nike

我对 Cocoa 编程是全新的,并且仍然对事物如何连接在一起感到困惑。

我需要一个非常简单的应用程序,每当单击窗口上的任何点时,它都会触发一个命令(我们称之为 DoStuff)。经过一番研究后,看起来子类化 NSView 是正确的方法。我的 ClickerView.m 文件包含以下内容:

- (void)mouseDown:(NSEvent *)theEvent {
NSLog(@"mouse down");
}

我已将 View 添加到窗口中,并将其扩展到整个窗口,并且每次单击窗口时都会正确写入日志。

我的 Controller 上也有我的 doStuff 方法(我想这可以重构为它自己的类,但现在它可以工作):

- (IBAction)doStuff:(id)sender {
// do stuff here
}

那么,如何在 ClickerView 中获取 mouseDown 以便能够在 Controller 中调用 DoStuff ?我有很强的 .NET 背景,因此,我只需在 ClickerView 中有一个 Controller 将使用的自定义事件;我只是不知道如何在 Cocoa 中做到这一点。

根据 Joshua Nozzi 的建议进行编辑

我向我的 View 添加了一个 IBOutlet(并将其更改为 NSControl 子类):

@interface ClickerView : NSControl {
IBOutlet BoothController *controller;
}
@end

我通过单击 View 上 socket 面板中的controller 项并将其拖动到 Controller ,将 Controller 连接到它。我的 mouseDown 方法现在看起来像:

- (void)mouseDown:(NSEvent *)theEvent {
NSLog(@"mouse down");
[controller start:self];
}

但是 Controller 没有实例化,调试器将其列为 0x0,并且消息没有发送。

最佳答案

您可以像 Joshua 所说的那样将其添加为 IBOutlet,也可以使用委托(delegate)模式。

您将创建一个协议(protocol)来描述您的委托(delegate)的方法,例如

@protocol MyViewDelegate
- (void)doStuff:(NSEvent *)event;
@end

然后你会让你的 View Controller 符合 MyViewDelegate 协议(protocol)

@interface MyViewController: NSViewController <MyViewDelegate> {
// your other ivars etc would go here
}
@end

然后你需要在MyViewController的实现中提供doStuff:的实现:

- (void)doStuff:(NSEvent *)event
{
NSLog(@"Do stuff delegate was called");
}

然后在您看来,您应该为委托(delegate)添加一个弱属性。委托(delegate)应该是弱的,这样就不会形成保留循环。

@interface MyView: NSView

@property (readwrite, weak) id<MyViewDelegate> delegate;

@end

然后在你看来你会得到这样的东西

- (void)mouseDown:(NSEvent *)event
{
// Do whatever you need to do

// Check that the delegate has been set, and this it implements the doStuff: message
if (delegate && [delegate respondsToSelector:@selector(doStuff:)]) {
[delegate doStuff:event];
}
}

最后:)每当你的 View Controller 创建 View 时,你都需要设置委托(delegate)

 ...
MyView *view = [viewController view];
[view setDelegate:viewController];
...

现在,只要单击您的 View ,就应该调用 View Controller 中的委托(delegate)。

关于cocoa - NSView 子类如何与 Controller 通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6891030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com