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

Posted

技术标签:

【中文标题】SwiftUI 在 iOS 13 版本中不能使用 navigationBarTitle 修饰符(已弃用),但在 iOS 14 中可以【英文标题】:SwiftUI can't use navigationBarTitle modifier (deprecated) in iOS 13 versions, but can in 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。我编辑了我的帖子 【参考方案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 之类的变量。

【讨论】:

以上是关于SwiftUI 在 iOS 13 版本中不能使用 navigationBarTitle 修饰符(已弃用),但在 iOS 14 中可以的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI iOS 14中的新UIDatePicker

SwiftUI iOS13情况下实现类似于CollectionView的效果

SwiftUI iOS13情况下实现类似于CollectionView的效果

SwiftUI iOS13情况下实现类似于CollectionView的效果

SwiftUI iOS13情况下实现类似于CollectionView的效果

在 iOS 13 之后的未来 iOS 版本中是不是仍支持故事板? [关闭]