如何使用自定义初始化创建自定义 UINavigationController class?
How to create custom UINavigationController class with custom init?
我尝试创建自定义 UINavigationController
class 如下-
class NavigationController: UINavigationController {
private let user: User
init(user: User, rootViewController: UIViewController) {
self.user = user
super.init(rootViewController: rootViewController)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
以上代码在运行时失败并出现以下错误-
Fatal error: Use of unimplemented initializer 'init(nibName:bundle:)' for class 'app.NavigationController'
我尝试通过添加初始化程序来解决问题
class NavigationController: UINavigationController {
private let user: User
init(user: User, rootViewController: UIViewController) {
self.user = user
super.init(rootViewController: rootViewController)
}
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
编译器抛出错误"Property 'self.user' not initialized at super.init call"。
有没有办法在不将 user
属性 作为隐式展开可选的情况下解决这个问题?
不要像这样初始化 用户。
在 Controller 中,你称之为 NavigationController
:
将private let user : User
改为
var user : User!
初始化你的 NavigationController
然后像这样设置用户:
navigationController.user = self.user
其中 self.user
是您要赋予 navigationController
的 变量
方法
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?)
是指定的初始化程序,这意味着它将始终被调用,而
init(rootViewController: )
是一个方便的初始化程序,可能出于方便的原因而被调用。当调用指定的初始化程序时,您的 class 有一个未初始化的用户常量。您可以将 user 切换为可选 var 并使用 nil 对其进行初始化。
您可以执行以下操作:
class NavigationController: UINavigationController {
private let user: User
init(user: User, rootViewController: UIViewController, nibName nibNameOrNil: String? = nil, bundle nibBundleOrNil: Bundle? = nil) {
self.user = user
super.init(nibName: nil, bundle: nil)
self.viewControllers = [rootViewController]
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
let vc = UIViewController()
let nc = NavigationController(user: User(), rootViewController: vc)
使用带有自定义参数的便捷初始化并调用指定的初始化程序来设置根 viewController
final class NavigationController: UINavigationController {
private var user: User?
convenience init(rootViewController: UIViewController, user: User) {
self.init(rootViewController: rootViewController)
self.user = user
}
override init(rootViewController: UIViewController) {
super.init(rootViewController: rootViewController)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
/// How to use
let user = User()
let rootViewController = UIViewController()
let navigationController = NavigationController(rootViewController: rootViewController, user: user)
我尝试创建自定义 UINavigationController
class 如下-
class NavigationController: UINavigationController {
private let user: User
init(user: User, rootViewController: UIViewController) {
self.user = user
super.init(rootViewController: rootViewController)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
以上代码在运行时失败并出现以下错误-
Fatal error: Use of unimplemented initializer 'init(nibName:bundle:)' for class 'app.NavigationController'
我尝试通过添加初始化程序来解决问题
class NavigationController: UINavigationController {
private let user: User
init(user: User, rootViewController: UIViewController) {
self.user = user
super.init(rootViewController: rootViewController)
}
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
编译器抛出错误"Property 'self.user' not initialized at super.init call"。
有没有办法在不将 user
属性 作为隐式展开可选的情况下解决这个问题?
不要像这样初始化 用户。
在 Controller 中,你称之为 NavigationController
:
将
private let user : User
改为var user : User!
初始化你的 NavigationController
然后像这样设置用户:
navigationController.user = self.user
其中 self.user
是您要赋予 navigationController
方法
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?)
是指定的初始化程序,这意味着它将始终被调用,而
init(rootViewController: )
是一个方便的初始化程序,可能出于方便的原因而被调用。当调用指定的初始化程序时,您的 class 有一个未初始化的用户常量。您可以将 user 切换为可选 var 并使用 nil 对其进行初始化。
您可以执行以下操作:
class NavigationController: UINavigationController {
private let user: User
init(user: User, rootViewController: UIViewController, nibName nibNameOrNil: String? = nil, bundle nibBundleOrNil: Bundle? = nil) {
self.user = user
super.init(nibName: nil, bundle: nil)
self.viewControllers = [rootViewController]
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
let vc = UIViewController()
let nc = NavigationController(user: User(), rootViewController: vc)
使用带有自定义参数的便捷初始化并调用指定的初始化程序来设置根 viewController
final class NavigationController: UINavigationController {
private var user: User?
convenience init(rootViewController: UIViewController, user: User) {
self.init(rootViewController: rootViewController)
self.user = user
}
override init(rootViewController: UIViewController) {
super.init(rootViewController: rootViewController)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
/// How to use
let user = User()
let rootViewController = UIViewController()
let navigationController = NavigationController(rootViewController: rootViewController, user: user)