【问题标题】:SwiftUI NavigationLink causes a push to happen, then it pops after completion, then pushes again for goodSwiftUI NavigationLink 导致推送发生,然后在完成后弹出,然后再次推送
【发布时间】:2021-03-24 06:35:03
【问题描述】:

我的 SwiftUI 代码中有一些奇怪的动画效果。在我的sheet 中,我的根视图SafariQuickTopicView 代码如下。

当我点击我的horizontalScroll 中的任何按钮时,actionState 将更新为readyToTransition,视图将推送,然后在完成时它会暂时弹回上一个视图,然后再次推送为好给我的新View

知道为什么要这样做吗?我认为这可能与我的SafariView 有关,因为它仍在发生,我已从下面的代码中删除了它。该视图是一个符合UIViewRepresentableSafariViewController,值得。

谢谢


    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
    @EnvironmentObject var state: AppState

    @Binding var articleDisplayed: Bool

    @State var actionState: ActionState? = .setup

    // MARK: - Body

    var body: some View {
        NavigationView {
            ZStack(alignment: .bottom) {
                horizontalScroll
            }
            .navigationBarTitle("", displayMode: .inline)
            .navigationBarItems(trailing: passButton)
        }
    }

    // MARK: - Subviews

    private var horizontalScroll: some View {
        return ScrollView(.horizontal, showsIndicators: false) {
            HStack {
                ForEach(0..<self.multiTopics.endIndex) { i in
                    NavigationLink(destination: self.tagView, tag: .readyForTransition, selection: self.$actionState) {
                        MultiTopicView(
                            articleDisplayed: self.$articleDisplayed,
                            actionState: self.$actionState,
                            topics: self.multiTopics[i],
                            setTopics: { self.topicsWereSet(topics: self.multiTopics[i]) }
                        )
                    }
                }

                NavigationLink(destination: topicsView) {
                    Text("More Topics")
                }
            }
            .padding(.horizontal, 12)
            .frame(maxHeight: 55)
        }
        .background(Color.white)
        .padding(.top, -11)
    }

struct MultiTopicView: View {

    @Binding var articleDisplayed: Bool
    @Binding var actionState: ActionState?
    let topics: [Topic]
    let setTopics: () -> Void

    var topicNames: String {
        topics.map { $0.name }.joined(separator: ", ")
    }

    var body: some View {
        Button(action: {
            self.actionState = .readyForTransition
        }) {
            Text(self.topicNames)
        }
    }
}


【问题讨论】:

  • 它是不可测试的,但我看到你所有的链接都有相同的标签,所以激活一个,你激活它们......在这之后一切都是不可预测的,可能会导致任何事情。每个链接的标签必须是唯一的,就像标识符一样 - 指定应该激活哪个链接。
  • 您在哪里看到标签必须是唯一的?我在 Apple 的文档中没有发现这一点

标签: ios swift swiftui


【解决方案1】:

您不能对每个 NavigationLink 使用相同的标签。

将 NavigationLink 绑定到选择变量并提供变量类型的标记。将 selection 的值设置为 tag 执行导航。

https://developer.apple.com/documentation/swiftui/navigationlink

如果使用相同的标签,所有的导航链接会同时进行导航。
这是未定义的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多