提问人:Adham Raouf 提问时间:11/13/2023 最后编辑:HangarRashAdham Raouf 更新时间:11/14/2023 访问量:154
“traitCollectionDidChange”在 iOS 17.0 中已弃用。如何使用替代品?
‘traitCollectionDidChange’ was deprecated in iOS 17.0. How do I use the replacement?
问:
我正在尝试使用此功能,但它不适用于 iOS 17。 每次在深色和浅色模式之间切换时,我都想进行更改。
这是我的职能:
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
// Check if the user interface style has changed
if self.traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
// User interface style has changed (light to dark or vice versa)
if self.traitCollection.userInterfaceStyle == .light {
// Code to execute in light mode
print("App switched to light mode")
} else {
// Code to execute in dark mode
print("App switched to dark mode")
}
}
}
这是问题所在:
“traitCollectionDidChange”在 iOS 17.0 中已弃用:使用 UITraitChangeObservable 协议中声明的特征更改注册 API
我应该使用还是代替?我不知道如何使用它。registerForTraitChanges(_:handler:)
registerForTraitChanges(_:target:action:)
答:
traitCollectionDidChange
自 iOS 17.0 起已弃用。解决方案取决于应用的部署目标。如果您的应用的部署目标早于 iOS 17.0(Xcode 15 支持回到 iOS 12),那么继续使用 .即使在装有 iOS 17 的设备上,它也会继续被调用。如果部署目标较旧,甚至不会收到弃用警告。traitCollectionDidChange
如果应用的部署目标是 iOS 17.0 或更高版本,则不应覆盖,因为它现已弃用。如 traitCollectionDidChange
的文档所示,您可以改用 registerForTraitChanges(_:handler:) 或 registerForTraitChanges(_
:target:action:)。
traitCollectionDidChange
这两种新方法的文档都提供了如何使用它们的示例。关键是要找到你的代码希望使用的特征。
在你的情况下,你希望处理对 UITraitUserInterfaceStyle
的更改。您可以在 UIMutableTraits
页面上找到可以注册的特征列表。
通过删除 的使用并将以下内容添加到以下位置来更新代码:traitCollectionDidChange
viewDidLoad
registerForTraitChanges([UITraitUserInterfaceStyle.self], handler: { (self: Self, previousTraitCollection: UITraitCollection) in
if self.traitCollection.userInterfaceStyle == .light {
// Code to execute in light mode
print("App switched to light mode")
} else {
// Code to execute in dark mode
print("App switched to dark mode")
}
})
请注意,文档明确指出,您可以安全地忽略返回值,并且不需要注销。如果注册的生存期更有限,则需要使用返回值并注销。
您的更新不需要调用,因为在这种情况下,只有在用户界面样式更改时才会调用处理程序代码。hasDifferentColorAppearance(comparedTo:)
注意 - 如果您的部署目标早于 iOS 17,请不要同时使用旧代码和新代码,因为在装有 iOS 17 的设备上运行时,实际上会调用这两组代码。您最终会得到两组类似的代码,每组代码都用适当的检查进行包装。if #available
评论