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

Can I use a super class to push to a new view controller which is also inherited?

我有两个超级视图控制器 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 中执行此操作,显然它不知道什么 [=16] =]?

在父级上创建一个名为 detailVCClass() 的方法,响应应在点击按钮时实例化的 class。家长可以回答一些通用的问题,子classes 回答任何适合每个人了解的class。

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

however, I'm just wondering if I can do this in my MasterCategoryListViewController, obviously without it knowing anything about what CustomItemController ?

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

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

在您的 MasterCategoryListViewController 中,有一个 MasterCategoryItemViewController 的对象。然后在您的 CustomListController 中应用任何子 classing MasterCategoryListViewController class。接下来,将 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
    }
}