UIViewController 多重继承

UIViewController multiple inheritance

我有一个名为 BaseViewController 的 class,它包含一个函数,我可以在其中将 header 添加到我的 VC 并锚定它

class BaseViewController: UIViewController {

    let headerView: UIView = {
        let view = UIView()
        view.backgroundColor = UIColor.green
        return view
    }()

    func addHeader() { 
        view.addSubview(headerView)
        // then anchor it to top
    }

}

我有另一个名为 ScrollViewController 的 class,它将一个 scrollViewController 添加到我的 VC 并锚定它

class ScrollViewController: UIViewController {

    let scrollView: UIScrollView = {
        let view = UIScrollView()
        view.backgroundColor = UIColor.green
        return view
    }()

    func addScrollView() { 
        view.addSubview(scrollView)
        // then anchor it to top
    }

}

最后,我的主要 class HomeViewController 想要同时拥有 header 和 scrollView,所以我继承了两者,如下所示:

class HomeViewController: ScrollViewController, BaseViewController {

    override viewDidLoad() {
        super.viewDidLoad()

        addScrollView()
        addHeaderView()

        let view = UIView()
        //anchor view to bottom of the header
    }
}

但是 swift 不允许多重继承,所以我尝试使用有效的协议和扩展,但问题是我希望其他视图能够锚定到 header 和 scrollView所以它不符合我的需要。

我该怎么做才能实现类似的东西

谢谢

Swift不支持多重继承。然而,协议和协议扩展可以完成你想要的。

示例:

protocol HeaderProtocol {
    func addHeaderView() -> UIView
}

extension HeaderProtocol where Self: UIViewController {
    func addHeaderView() -> UIView {
        let headerView = UIView()
        headerView.backgroundColor = UIColor.green
        view.addSubview(headerView)
        // then anchor it to top

        return headerView
    }
}

protocol ScrollViewProtocol {
    func addScrollView() -> UIView
}

extension ScrollViewProtocol where Self: UIViewController {
    func addScrollView() -> UIView {
        let scrollView = UIScrollView()
        scrollView.backgroundColor = UIColor.green
        view.addSubview(scrollView)
        // then anchor it to top

        return scrollView
    }
}

class HomeViewController: UIViewController, ScrollViewProtocol, HeaderProtocol {
    override func viewDidLoad() {
        super.viewDidLoad()

        let scrollView = addScrollView()
        let headerView = addHeaderView()
    }
}

替代方法:

protocol HeaderProtocol {
    var headerView: UIView? { get set }
    func addHeaderView() -> UIView
}

extension HeaderProtocol where Self: UIViewController {
    func addHeaderView() -> UIView {
        let headerView = UIView()
        headerView.backgroundColor = UIColor.green
        view.addSubview(headerView)
        // then anchor it to top

        return headerView
    }
}

protocol ScrollViewProtocol {
    var scrollView: UIView? { get set }
    func addScrollView() -> UIView
}

extension ScrollViewProtocol where Self: UIViewController {
    func addScrollView() -> UIView {
        let scrollView = UIScrollView()
        scrollView.backgroundColor = UIColor.green
        view.addSubview(scrollView)
        // then anchor it to top

        return scrollView
    }
}

class HomeViewController: UIViewController, ScrollViewProtocol, HeaderProtocol {
    var scrollView: UIView?
    var headerView: UIView?

    override func viewDidLoad() {
        super.viewDidLoad()

        scrollView = addScrollView()
        headerView = addHeaderView()
    }
}