我有两个超级视图控制器MasterCategoryListViewController
和MasterCategoryItemViewController
。
我想在几个应用程序中使用这些。
我从这两个继承
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
}
}