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