gpt4 book ai didi

ios - 在 Swift 中继承自 UINavigationController

转载 作者:行者123 更新时间:2023-11-28 15:30:01 24 4
gpt4 key购买 nike

我有一个扩展 UINavigationController 的类。

class MyNavigationController: UINavigationController {
var reservationId: Int
var blankViewController: BlankViewController

init(clientId aClientId: Int, reservationId aReservationId: Int) {

blankViewController = BlankViewController()

clientId = aClientId
reservationId = aReservationId

super.init(rootViewController: blankViewController)
}

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

这是按部就类的做事。我的指定初始值设定项正在调用父类(super class)指定初始值设定项。但是应用程序在运行时崩溃并显示以下消息:

fatal error: use of unimplemented initializer 
'init(nibName:bundle:)' for class 'MyiOSApp.MyNavigationController'

通过反复试验,我改用此方法解决了问题。

init(clientId aClientId: Int, reservationId aReservationId: Int) {

blankViewController = BlankViewController()

clientId = aClientId
reservationId = aReservationId

super.init(nibName: nil, bundle: nil)
}

但是 init(nibName: nil, bundle: nil) 不是直接父类(super class)的指定初始化器。从技术上讲,这甚至不应该编译。所以我非常困惑。我违反了第一个代码的具体规则是什么?如果我确实违反了一些规则,为什么编译器没有捕捉到它?

一个可能的解释是 init(nibName:, bundle:) 是必需的初始化器。但这种解释存在问题。据我所知,init(nibName:, bundle:)init(rootViewController:)init?(coder:)在文档或 Xcode 的源代码 View 中标记为必需。出于某种原因,编译器认为 init?(coder:) 是必需的,但对于其他 init 方法则不是这样。这一切都非常奇怪。

编辑:你们中的许多人都发布了说明如何让它发挥作用的答案。我的问题不是关于那个。正如我在问题中所指出的那样,我已经可以让它发挥作用了。我的问题是关于 Swift 初始化程序规则,以及我可能违反的内容。

最佳答案

如果您也覆盖 init(nibName:,bundle:),您的子类将工作。

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}

您还必须为您的属性提供默认值。

关于ios - 在 Swift 中继承自 UINavigationController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44827226/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com