gpt4 book ai didi

swift - 带有 `isActive=true` 的嵌套导航链接未正确显示

转载 作者:行者123 更新时间:2023-12-04 14:54:28 24 4
gpt4 key购买 nike

我已经开始学习 SwiftUI,但是在构建我的 NavigationView 时遇到了一些问题 - 我不确定这是否是一个错误,或者我是否误解了嵌套导航链接应该如何工作!
这是我当前的代码:

import SwiftUI

struct ContentView: View {
var body: some View {
NavigationView {
ViewOne()
}
}
}

struct ViewOne: View {
@State var isActiveOne: Bool = true

var body: some View {
VStack {
Text("View One")

NavigationLink(
destination: ViewTwo(),
isActive: $isActiveOne,
label: { EmptyView() }
)

Button(
action: { self.isActiveOne = true },
label: { Text("Set isActiveOne=true") }
)
}
}
}

struct ViewTwo: View {
@State var isActiveTwo: Bool = true

var body: some View {
VStack {
Text("View Two")

NavigationLink(
destination: Text("Success!"),
isActive: $isActiveTwo,
label: { EmptyView() }
)

Button(
action: { self.isActiveTwo = true },
label: { Text("Set isActiveTwo=true") }
)
}
}
}

struct ContentView_Preview: PreviewProvider {
static var previews: some View {
ContentView()
}
}
我希望:
  • NavigationView 显示 ViewOne
  • ViewOne 有 isActiveOne == true,所以显示第一个 NavigationLink 目的地(显示 ViewTwo)
  • ViewTwo 具有 isActiveTwo == true,因此显示第二个 NavigationLink 目的地(显示“成功!”)

  • 但是,当我在 iOS 14.5 模拟器上运行此代码时,第二个 NavigationLink 不会自动显示(我只看到 ViewTwo Button 文本)。
    我还觉得奇怪的是,如果我默认 isActiveTrue 为 false,然后按下按钮,它会正确导航 - 关于默认“true”状态+嵌套导航链接的组合似乎导致了问题。
    知道这是否是 SwiftUI 中的错误吗?还是我在这里的设置有问题?
    任何想法都会有很大的帮助 - 我已经有一段时间用头撞墙了......
    Preview Screenshot

    最佳答案

    这看起来像是一个错误,您可以将其提交至 https://feedbackassistant.apple.com
    一个临时的解决方法是把你的 NavigationLink s 在列表中。这似乎适用于 iOS 14.5 和 15(测试版 2)
    隐形名单
    如果您不想要列表行为/外观,那么您可以将列表放在背景上并使其透明(使用 opacity 修饰符)
    以下是不可见列表解决方法的示例:

    struct WorkaroundLink<Destination: View>: View {
    let destination: Destination
    let isActive: Binding<Bool>

    var body: some View {
    List {
    NavigationLink(
    destination: destination,
    isActive: isActive,
    label: { EmptyView() }
    )
    }.opacity(0.01)
    }
    }

    extension View {
    func workaroundLink<D: View>(to destination: D, isActive: Binding<Bool>) -> some View {
    background(WorkaroundLink(destination: destination, isActive: isActive))
    }
    }
    用这个结构重写你的例子变成:
    struct ContentView: View {
    var body: some View {
    NavigationView { ViewOne() }
    }
    }

    struct ViewOne: View {
    @State var isActiveOne = true

    var body: some View {
    VStack {
    Text("View One")
    Button("Set isActiveOne=true") { isActiveOne = true }
    }.workaroundLink(to: ViewTwo(), isActive: $isActiveOne)
    }
    }

    struct ViewTwo: View {
    @State var isActiveTwo = true
    var body: some View {
    VStack {
    Text("View Two")

    Button(
    action: { self.isActiveTwo = true },
    label: { Text("Set isActiveTwo=true") }
    )
    }.workaroundLink(to: Text("Success!"), isActive: $isActiveTwo)
    }
    }

    关于swift - 带有 `isActive=true` 的嵌套导航链接未正确显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68365774/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com