“traitCollectionDidChange”在 iOS 17.0 中已弃用。如何使用替代品?

‘traitCollectionDidChange’ was deprecated in iOS 17.0. How do I use the replacement?

提问人:Adham Raouf 提问时间:11/13/2023 最后编辑:HangarRashAdham Raouf 更新时间:11/14/2023 访问量:154

问:

我正在尝试使用此功能,但它不适用于 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:)

iOS Swift 用户界面 UIKIT UITRAITCOLLECTION

评论


答:

3赞 HangarRash 11/14/2023 #1

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 页面上找到可以注册的特征列表。

通过删除 的使用并将以下内容添加到以下位置来更新代码:traitCollectionDidChangeviewDidLoad

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