SwiftUI 在 iOS 13 版本中不能使用 navigationBarTitle 修饰符(已弃用),但在 iOS 14 中可以

SwiftUI can't use navigationBarTitle modifier (deprecated) in iOS 13 versions, but can in iOS 14

我将我的最低部署目标从 iOS 14.0 降低到 iOS 13.0。然后我得到了这个错误:

'navigationBarTitle(_:displayMode:)' is only available in iOS 14.0 or newer

但是,documentation says it's available from iOS 13.0-14.2, and previous SO answers 发布的(回到 iOS 13 是最新的)也使用了它。

是因为它“已弃用”所以我不能使用它吗?但是为什么我可以在 iOS 14.0 中使用它?


编辑:

尝试重现后,似乎只有当我没有将 title 存储在 属性 中时它才有效。

import SwiftUI

struct ContentView: View {
    var body: some View {
        Text("Hi!")
            .navigationBarTitle("Title", displayMode: .inline)
    }
}
struct DetailView: View {
    var title: String = ""
    var body: some View {
        Text("Hi!")
            .navigationBarTitle(title, displayMode: .inline)
    }
}

如果您仔细查看 navigationBarTitle 调用的解析结果,它不是您链接的方法:

func navigationBarTitle(_ title: Text, displayMode: NavigationBarItem.TitleDisplayMode) -> some View

是:

func navigationBarTitle<S>(_ title: S, displayMode: NavigationBarItem.TitleDisplayMode) -> some View where S : StringProtocol

无法解析为第一个,因为您没有传递 Text 作为标题,是吗?您将参数 title 声明为 String.

Here's 第二种方法的文档。从文档中我们可以清楚地看到它在 iOS 14.0 到 14.2 之间可用。

之所以使用字符串文字作为标题有效(例如在 ContentView 中)是因为您正在调用 navigationBarTitleyet another overload:

func navigationBarTitle(_ titleKey: LocalizedStringKey, displayMode: NavigationBarItem.TitleDisplayMode) -> some View

LocalizedStringKey 符合 ExpressibleByStringLiteral,因此字符串文字可以传递给类型 LocalizedStringKey 的参数,但不能传递给 title.[=26= 这样的变量]

这是因为您在标题中使用的是字符串而不是文本视图。

我 运行 遇到了和你一样的问题。

基本上在 iOS 14 中,他们添加了将字符串直接放入导航栏的功能。在此之前,您必须使用 .navigationBarTitle(Text(yourString), displayMode: .inline)