【问题标题】:SwiftUI can't use navigationBarTitle modifier (deprecated) in iOS 13 versions, but can in iOS 14SwiftUI 在 iOS 13 版本中不能使用 navigationBarTitle 修饰符(已弃用),但在 iOS 14 中可以
【发布时间】:2020-11-06 03:09:58
【问题描述】:

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

'navigationBarTitle(_:displayMode:)' 仅适用于 iOS 14.0 或更高版本

但是,documentation 表示它在 iOS 13.0-14.2 中可用,并且之前发布的 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() 已被弃用并被 .navigationTitle() 取代
  • 你使用哪个 Xcode 版本?
  • @Asperi 12.1 (12A7403)。
  • @Sweeper 1. 创建新的 SwiftUI 项目,2. 将最小部署目标降低到 13.0,3. 替换ContentViewstruct ContentView: View { var title: String = ""; var body: some View { Text("Hello, world!").navigationBarTitle(title, displayMode: .inline) } }
  • 嗯,如果我删除 title 属性似乎可以工作。当我添加它时,错误又回来了。见imgur.com/a/rfRCGYn。我编辑了我的帖子

标签: ios swift xcode swiftui deprecated


【解决方案1】:

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

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

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

【讨论】:

  • 是的!有点愚蠢的错误。
【解决方案2】:

如果您仔细查看 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 中)是因为您调用的是yet another overload of navigationBarTitle

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

LocalizedStringKey 符合ExpressibleByStringLiteral,因此字符串文字可以传递给LocalizedStringKey 类型的参数,但不能传递给title 之类的变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 2020-11-14
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    相关资源
    最近更新 更多