Могу ли я использовать суперкласс для отправки на новый контроллер представления, который также наследуется? - PullRequest
0 голосов
/ 20 января 2019

У меня есть два контроллера Super View 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?

Ответы [ 2 ]

0 голосов
/ 20 января 2019

однако, мне просто интересно, смогу ли я сделать это в моем 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
    }
}
0 голосов
/ 20 января 2019

Создайте метод в родительском объекте, который называется что-то вроде detailVCClass(), отвечая на класс, который должен быть создан при нажатии кнопки. Родитель может ответить на что-то общее, а подклассы отвечают на любой класс, о котором каждый должен знать.

Пусть метод нажатия кнопки создает экземпляр self.detailVCClass(), а не литерал имени класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...