Как создать подкласс UINavigationController & UISearchController для внедрения зависимостей? - PullRequest
0 голосов
/ 29 июня 2019

Может кто-нибудь объяснить, почему я должен переопределить init (nibName, bundle) на UINavigationController и UISearchController?

import UIKit

class DashboardNav: UINavigationController {

    var dashboard: UIViewController?

    init(dashboard: UIViewController) {
        self.dashboard = dashboard
        super.init(rootViewController: dashboard)
        self.tabBarItem = UITabBarItem(title: "Dashboard", image: #imageLiteral(resourceName: "vectorEq"), tag: 1)
    }

    //FIXME: Why does this get called after init
    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder aDecoder: NSCoder) { fatalError("IMPOSSIBLE")}
}

Этот код скомпилируется, но он обнулит мою ссылку на приборную панель, заставляя меня устанавливать ее после создания, которое я не хочу. Сначала запускается пользовательский init, а затем запускается init (nibName, bundle). Вот код строительства работы вокруг.

let dashBoard = UIViewController()
let dashboardNav = DashboardNav(dashboard: dashboardScreen)
dashboardNav.dashboard = dashBoard //FIXME: this is bad

Если я удаляю init (nibName, bundle), приложение вылетает из-за исключения.

Я наблюдал такое же поведение в подклассе UISearchController. Вот конструкция, показывающая работу вокруг.

let sortToolBar = SortToolbar()
let search = Search(Database: database, sortToolBar: sortToolBar)
search.sortToolBar = foodSortToolBar //FIXME: =0
search.searchBar.inputAccessoryView = foodSortToolBar //FIXME: =0
search.foodDatabase = foodDatabase //FIXME: init(nibName) seems to be reinitializing

Вот подкласс UISearchController.

import UIKit

class Search: UISearchController {

    var foodDatabase: FoodDatabase? //FIXME: ? var is here because init(nib) complains it's not
    var foodSortToolBar: FoodSortToolbar? //FIXME: =0

    init(database: Database, sortToolBar: SortToolbar) {
        self.foodDatabase = foodDatabase    //FIXME: Still have to attach it post construction
        self.foodSortToolBar = foodSortToolBar
        super.init(searchResultsController: nil) //FIXME: Calls init(nibName, bundle)


        //FIXME: Inject the search bar...couldn't get it to work
        self.searchBar.delegate = self
        self.searchBar.scopeButtonTitles = ["Totality", "Frequency", "Recency"]
        self.searchBar.showsScopeBar = true
        self.searchBar.placeholder = "Food Search"
        self.searchBar.showsCancelButton = true
        self.searchBar.showsSearchResultsButton = false
        self.searchBar.searchBarStyle = .minimal

    }

    //FIXME: Why does this get called after init
    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }
}

Кто-нибудь знает причину механизма? Пожалуйста, порекомендуйте. Спасибо.

Aaron

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