Objective-C 委托与 Java 侦听器

2022-09-02 13:37:21

我读过一堆关于Objective-C委托的文章和读物,试图理解它们。来自Java,他们看起来非常像Java的听众。例如,假设我在Java中有一个按钮。当按钮被按下时,我希望发生一些事情。我的代码可能看起来像这样:

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

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

    }
}

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

谢谢!


答案 1

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

– textViewShouldBeginEditing:
– textViewDidBeginEditing:
– textViewShouldEndEditing:
– textViewDidEndEditing:

我发现的唯一真正的区别是,你不能以内联方式创建委托,就像你在java中一样:

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

答案 2

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

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

NSButton/UIButton已经通过target+action机制专门处理这种情况。对于此特定情况,您将使用目标 + 操作。


推荐