【问题标题】:macOS 上的 NavigationLink 导致源视图出现两次
【发布时间】:2022-01-23 08:20:59
【问题描述】:

概述:

  • macOS 上使用NavigationLink 时,源视图出现两次。
  • 它只发生在macOS 上(参见print 语句)

问题:

  • 如何解决这个问题?
  • 有解决方法吗?

代码:

import SwiftUI

struct ContentView: View {
    
    let names = ["aaa"]
    
    var body: some View {
        NavigationView {
            List {
                ForEach(names, id: \.self) { name in
                    NavigationLink(destination: Text("dest")) {
                        Text(name)
                            .onAppear {
                                print("\(name) appeared")
                            }
                    }
                }
            }
        }
    }
}

【问题讨论】:

  • SwiftUI 自 iOS14 发布以来得到了很大的改进,但导航视图/导航链接仍然不稳定,在我的情况下,它是本地化的导航栏标题。所以应该等待下一个版本或向苹果提交错误
  • 不要依赖 onAppear 的调用次数,它不(也不会)由我们控制。在 Apple 的愿​​景中,它的意思是“出现在视图层次结构中”而不是“在屏幕上”,并且在视图层次结构中它可能出现的次数与构造的次数一样多(在屏幕上可见之前),这可能取决于很多事情。
  • @Asperi 问题是我在列表中有一个 TextField,所以它被重新创建了两次,导致抛出一些警告,绑定被多次更改

标签: swift macos swiftui


【解决方案1】:

要解决此问题,只需将.onAppear“附加”到您的NavigationLink 而不是Text

EDIT-1:

这是我用来显示将 .onAppear 移动到 NavigationLink 如图,只打印一个就出现了。

我使用的是 macos 12,Xcode 13.2,在 iMac 上使用 macos 12.2 进行了测试。

import SwiftUI

@main
struct MacOnlyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
struct ContentView: View {
    let names = ["aaa"]
    
    var body: some View {
        NavigationView {
            List {
                ForEach(names, id: \.self) { name in
                    NavigationLink(destination: Text("dest")) {
                        Text(name)
                    }
                    .onAppear {
                        print("----> \(name) appeared \n")
                    }
                }
            }
        }
    }
}

【讨论】:

  • 谢谢@dudette,但真正的根本问题是我在列表中有一个TextField,所以它被创建了两次,所以当用户输入文本时,会抛出一个警告,指出绑定被多次更改次
  • 我在您的代码中没有看到TextField。向我们展示您真正拥有的东西,以便我们为您提供帮助。我的回答是否适用于您向我们展示的代码?
  • 这是一个简化的示例,不显示 TextField。如果我停止视图出现两次,那么它将解决我的 TextField 问题。代码太大,无法发布,因此简化示例
  • 那么,我的回答是否为您停止了双重onAppear?很适合我。
  • 抱歉你的回答没有解决我的问题
猜你喜欢
  • 2020-01-16
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 2022-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多