EDIT: Вот весь code example для Xcode 6.4viewDidLoad вызывается перед весь метод инициализации выполняется
У меня есть простое приложение IOS без раскадровки. Я поставил rootViewController
для UIWindow
в AppDelegate.swift
, как это:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let tabBarController = TabBarController()
window = UIWindow(frame: UIScreen.mainScreen().bounds)
window?.rootViewController = tabBarController
window?.makeKeyAndVisible()
return true
}
TabBarController
реализация класса выглядит следующим образом:
class TabBarController: UITabBarController {
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
// Next line is called after 'viewDidLoad' method
println("init(nibName: bundle:)")
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
println("viewDidLoad")
}
}
При запуске приложения вывод консоли выглядит следующим образом:
viewDidLoad
init(nibName: bundle:)
Это означает, что строки после строки super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
вызывается после метода viewDidLoad
! Это происходит только для классов, которые наследуются от UITabBarController
. Если вы попробуете этот же пример с потоком UIViewController
, все будет в порядке, а viewDidLoad
вызывается после выполнения метода init.
спасибо. Но я считаю, что это противоречивое поведение и плохо документировано. Я отправляю TSI в Apple, и мне интересно увидеть их ответ. – Deny
@Deny Мне бы хотелось услышать, что Apple должна сказать, когда они дадут вам ответ, но я подозреваю, что вы не получите много дополнительной информации. Это стандартное поведение iOS. Вы правы, хотя в отношении отсутствия документации для подкласса TabBarController. – Artal