Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C委托与Java侦听器_Java_Objective C_Cocoa_Delegates_Listener - Fatal编程技术网

Objective-C委托与Java侦听器

Objective-C委托与Java侦听器,java,objective-c,cocoa,delegates,listener,Java,Objective C,Cocoa,Delegates,Listener,我读了很多关于Objective-C学员的文章和阅读资料,试图理解他们。来自Java,它们看起来非常像Java侦听器。例如,假设我在Java中有一个按钮。当按下按钮时,我希望有事情发生。我的代码可能如下所示: ButtonListener myButtonListener = new ButtonListener(); someButton.addActionListener(myButtonListener); ... class ButtonListener implements

我读了很多关于Objective-C学员的文章和阅读资料,试图理解他们。来自Java,它们看起来非常像Java侦听器。例如,假设我在Java中有一个按钮。当按下按钮时,我希望有事情发生。我的代码可能如下所示:

ButtonListener myButtonListener = new ButtonListener();    
someButton.addActionListener(myButtonListener);
...

class ButtonListener implements ActionListener
{
   public void actionPerformed(ActionEvent e)
   {

    }
}
差不多吧。在objective-c中,我似乎会为我的按钮调用setDelegate方法并将其作为委托传递给“listener”。然后,实际的button类可能会检查该委托是否响应某个选择器(即actionPerformed)。如果我用正确的方式思考这个问题,那么代表就像听众一样。对吗?有什么主要区别吗


谢谢

你几乎可以按按钮了。唯一真正的区别是obj-c中的委托通常实现多个函数,以对与其委托的对象相关的事件执行各种操作。例如,UITextViewDelegate具有以下方法:

– textViewShouldBeginEditing:
– textViewDidBeginEditing:
– textViewShouldEndEditing:
– textViewDidEndEditing:
我发现的唯一真正的区别是,不能像在java中那样以内联方式创建委托,比如:

someButton.setOnClickListener ( new View.OnClickListener {
    @Override
    public void onClick() {
        //do stuff
    }
});

它们相似,但不完全相同。委托模式具有更广泛的定义,并且通常是实现定义的任务,这些任务可以扩展到侦听之外。任务可以包括监听,或者代理的实现可以定义为监听(独占)

objc委托通常用于避免子类化,并用作侦听器或数据提供者。委托所做的是由协议定义的——它可以比侦听器提供更多的服务。因此,委托可以是数据源/提供者。它只是一种将实现转移到另一个类的方法,从类中删除经常定制的、特定于应用程序的实现


NSButton/UIButton已经通过target+操作机制专门用于此案例。您可以在这个特定的情况下使用target+action。

我认为在Java.util.concurrent pagkage中可以找到一个更好的Java模拟.NET委托:Callable,Future,Executor。

委托类似于侦听器或观察者,协议类似于接口,只是协议可以定义可选函数(也称为消息)。在Objective C中,您可以使用category来扩充现有类(没有其源代码),以采用协议并使其成为委托,这样就根本不需要创建新的匿名内部类。在Java中不能这样做。

从技术上讲,使用块可以生成内联委托。我在硬盘上的某个地方有一个实用程序类…哦,真的,我正在开发一个应用程序,以避免只为一个委托函数创建一个全新的类。我很想看看你是如何做到这一点的:标题:Main:。您需要为每个委托创建一个类,但是当您需要很多类时,这有助于减少类的数量。您有一个如何使用它的示例吗?我不确定我是否理解代码。Swift委托是否也与Java侦听器相同?