Может кто-нибудь объяснить, почему я должен переопределить 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