iOS:Objective-C 中的事件监听器相当于啥?

Posted

技术标签:

【中文标题】iOS:Objective-C 中的事件监听器相当于啥?【英文标题】:iOS: what is the equivalent of an event listener in Objective-C?iOS:Objective-C 中的事件监听器相当于什么? 【发布时间】:2012-05-16 13:18:32 【问题描述】:

在我的一些学习中,我看到有人提到在您的视图控制器中,您可以拥有一个模型,并在模型上设置某种监听器以进行更改。我认为我没有为这些使用正确的名称,这可能就是我的搜索没有出现任何结果的原因。本质上,我想将我的服务器调用从控制器移动到我的模型中,但我需要在它们上安装某种监听器来知道调用何时完成以更新我的视图。

【问题讨论】:

看看 Apple 的this document。 【参考方案1】:

调查代表 delegates tutorial

或者更高级的块 basic blocks tutorial

从代表开始,

您也可以使用 NSNotification NSNotification tutorial,但不建议使用它,因为它会向每个班级广播,并且您可能只需要向特定班级发送消息而不是每个班级

【讨论】:

我相信我读到的是关于 NSNotification 的内容,我倾向于这样做的原因是因为我希望模型不知道或不关心正在听的内容。当我在其他地方实现委托时,我需要了解委托,以便可以在其上调用特定方法。在这种情况下,我想建模以仅广播它已完成,因此无论哪个视图可能正在监听它,都可以以适合该特定视图的任何方式行事。 第一个链接断开 断开的链接,应为tutorialspoint.com/ios/ios_delegates.htm(应删除尾随“/”) @manuelBetancurt 似乎不再提供“基本块教程”。该网站似乎丢失了。【参考方案2】:

我认为您可能正在寻找 NSNotificationCenter,这是一种将消息传递给可能正在收听的人的方法。因此,您可以从模型中的事件发送通知,然后在控制器中监听它。一种更简洁的方法可能是使用委托实现您自己的协议。

【讨论】:

【参考方案3】:

Objective C 使用delegates

这篇文章有一个很好的例子:How do I create delegates in Objective-C?

【讨论】:

【参考方案4】:

您正在寻找 KVO - 键/值观察:

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html

http://nachbaur.com/2011/07/29/back-to-basics-using-kvo/

委托 + 通知非常适合对象之间的通信,但它们不会在值更改时自动发送消息(从您的问题来看,这就是您要问的问题)

【讨论】:

【参考方案5】:

属于 C# 世界,我必须去目标 c(为了我的工作)。 我认为目标 c 中的等效事件是这个实现:

使用所有事件的方法创建协议:

@protocol MyDelegate <NSObject>
    - (void)myEvent;
@end

在应该发送事件的类中,添加:

@interface MyClassWichSendEvent : NSObject

@property (nonatomic, retain) IBOutlet id<MyDelegate> delegate;

@end

在你想要的地方发起事件,例如:

- (IBAction)testEvent:(NSButton*)sender

    [self.delegate myEvent];

现在在你的监听器类中,你应该像这样监听事件:

将协议添加到你的监听类

@interface Document : NSDocument<MyDelegate>

在实现中,在 init 或 interface builder 中,您必须将对象实例的委托链接到侦听的类的 self 中。

在代码中

-(void)awakeFromNib

    myObjToListen.delegate = self;    

在 Interface Builder -> IBOutlet 从委托到您的监听类。

最后,在你的监听器类中实现你的方法:

- (void)myEvent

    NSLog(@"i have listen this event !");

对不起我的英语,我希望能帮助那些从 java 或 C# 开始的人。

【讨论】:

我不明白你如何在 id 上调用 myEvent?因为我看到的是委托是一个 IBOutlet id。你能详细解释一下吗?谢谢

以上是关于iOS:Objective-C 中的事件监听器相当于啥?的主要内容,如果未能解决你的问题,请参考以下文章

在本机 ios 中监听事件

ios里面怎样监听js的事件

怎样理解js中的事件监听

通过代理监听UIScrollView的滚动事件 Objective-C语言

iOS开发系列--Objective-C 之 KVCKVO

如何在 iOS 13 Objective-c 中处理鼠标事件