如何在视图控制器

时间:2018-05-09 14:51:42

标签: ios swift delegates delegation

我有一个非常一般的视图,由多个视图控制器创建和使用,有2个按钮,其中一个有时会根据需要隐藏。 该视图代表两个按钮的点击。

protocol TheViewsDelegate: class { 
     func button1Tapped()
     func button2Tapped()
}

让我们看看ViewControllerA创建了这个视图并需要两个按钮,这个视图控制器必须实现两个委托函数并在其中做一些事情。

现在让我们假设ViewControllerB创建相同的视图,但只需要其中一个按钮。该视图控制器必须仍然实现button2Tapped(),即使它永远不会被调用和使用。

有没有办法很好地处理这个问题?我想有一个很好的解决方案,如果我不需要它,我不需要实现这个button2Tapped()

我考虑通过提供默认实现使其成为可选项,但我不喜欢这个解决方案,我喜欢(我认为这是一个很好的做法)编译器在没有实现的方法时给我一个错误。有人可以跳进项目而没有意识到他/她在需要实现时没有实现button2Tapped。

注意:这是一个非常简单的例子,只是为了说明我的问题,但问题更广泛,如当委托中的函数由控制器定义时不需要做什么实施它。

2 个答案:

答案 0 :(得分:0)

我相信你想用:

可选功能

答案 1 :(得分:0)

有几种方法可以将协议方法声明为可选方法,一种方法是使用optional func,这需要使用@objc语法,许多程序员显然不喜欢这种语法,并且其他需要在协议扩展中声明一个空体(默认情况下使其成为可选)。

protocol TheViewsDelegate: AnyObject {
    func button1Tapped()
}
extension TheViewsDelegate {
    func button2Tapped() {}
}

class SomeViewController: UIViewController, TheViewsDelegate {
    func button1Tapped() {
        // implement
    }
}

通过在协议扩展中为协议提供一个空主体,该方法是可选的,不需要通过符合对象来实现。

作为比较,替代方案:

@objc protocol TheViewsDelegate: AnyObject {
    func button1Tapped()
    @objc optional func button2Tapped()
}

class SomeViewController: UIViewController, TheViewsDelegate {
    func button1Tapped() {
        // implement
    }
}