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

时间:2019-01-20 16:35:44

标签: ios swift cocoa-touch

我有两个超级视图控制器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的内容?

2 个答案:

答案 0 :(得分:1)

在父级上创建一个名为detailVCClass()之类的方法,回答应在单击按钮时实例化的类。父级可以回答通用的问题,子类可以回答适合每个人都知道的任何类。

具有按钮轻击方法可实例化self.detailVCClass()的实例,而不是类名文字。

答案 1 :(得分:0)

  

但是,我只是想知道我是否可以在自己的   MasterCategoryListViewController,显然是不知道的   关于什么CustomItemController?

是的。为什么不?但是,将被推送的是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
    }
}