如何使用自定义初始化创建自定义 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)