我可以使用 super class 推送到同样继承的新视图控制器吗?
Can I use a super class to push to a new view controller which is also inherited?
我有两个超级视图控制器 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
中执行此操作,显然它不知道什么 [=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
}
}
我有两个超级视图控制器 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
中执行此操作,显然它不知道什么 [=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
}
}