我可以使用超类推送到同样继承的新视图控制器吗?



我有两个超级视图控制器MasterCategoryListViewControllerMasterCategoryItemViewController

我想在几个应用程序中使用这些。

我从这两个继承

class CustomListController: MasterCategoryListViewController
class CustomItemController: MasterCategoryItemViewController

现在在MasterCategoryListViewController

我有一个按钮处理程序...

@objc open func btnAddTapped(sender: UIBarButtonItem) {
    let itemViewController = MasterCategoryItemViewController()
    itemViewController.title = "Type"
    self.navigationController?.pushViewController(itemViewController, animated: true)
}

我知道我可以覆盖推送到CustomItemController的方法,但是,我只是想知道我是否可以在我的MasterCategoryListViewController中执行此操作,显然它不知道CustomItemController什么?

在父级上创建一个名为 detailVCClass() 的方法,回答应在点击按钮时实例化的类。 父类可以回答一些泛型的东西,子类回答适合每个人知道的任何类。

让按钮点击方法实例化self.detailVCClass()的实例,而不是类名文本。

但是,我只是想知道我是否可以在我的 MasterCategoryListViewController,显然它不知道 关于什么自定义项控制器的任何事情?

是的。为什么不呢?然而,将被推送的是MasterCategoryItemViewController,而不是它的任何子类。所以就像你在问题中提到的,你知道btnAddTapped可以被覆盖,所以这样做。

或者,你可以做一些更有趣的事情:

在你的MasterCategoryListViewController中,有一个MasterCategoryItemViewController的对象。然后在您的CustomListController中,应用任何子类化MasterCategoryListViewController类。接下来,将该MasterCategoryItemViewController对象推送到btnAddTapped()

完整示例:

import UIKit
class ListVC: MasterListVC {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = "ListVC"
        self.itemVCToBePushed = ItemVC2()
    }
}
class MasterListVC: UIViewController {
    var itemVCToBePushed: MasterItemVC?
    lazy var button: UIButton = {
        let button = UIButton(type: .custom)
        button.frame = CGRect(x: 100, y: 100, width: 250.0, height: 44.0)
        button.setTitle("Test", for: .normal)
        button.addTarget(self, action: #selector(self.pushMe), for: .touchUpInside)
        button.backgroundColor = .gray
        return button
    }()
    @objc func pushMe() {
        guard let itemVCToBePushed = self.itemVCToBePushed else { return }
        self.navigationController?.pushViewController(itemVCToBePushed, animated: true)
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = "MasterListVC"
        self.view.backgroundColor = .white
        self.view.addSubview(self.button)
    }
}
/////
class ItemVC: MasterItemVC {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = "ItemVC"
    }
}
class ItemVC2: MasterItemVC {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = "ItemVC2"
    }
}
class MasterItemVC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = "MasterItemVC"
        self.view.backgroundColor = .white
    }
}

最新更新