UIViewController多重继承

问题描述 投票:1回答:1

我有一个名为BaseViewController的类,它包含一个函数,我可以在其中添加标题并锚定它

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的类,它将一个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
    }

}

最后我的主要类HomeViewController想要同时拥有一个标题和一个scrollView,所以我从这两个继承:

class HomeViewController: ScrollViewController, BaseViewController {

    override viewDidLoad() {
        super.viewDidLoad()

        addScrollView()
        addHeaderView()

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

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

我能做什么,所以我可以实现类似的东西

谢谢

ios swift protocols multiple-inheritance
1个回答
2
投票

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()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.