SwiftUI:如果不在列表中,NavigationLink 将不起作用

问题描述 投票:0回答:8

我猜这可能是 beta 3 中的一个错误,因为 NavigationView 全部损坏了。但这样的观点:

struct GenreBadge : View {
    @EnvironmentObject var store: Store<AppState>
    let genre: Genre

    var body: some View {
        NavigationLink(destination: MoviesGenreList(genre: genre).environmentObject(store)) {
            RoundedBadge(text: genre.name)
        }
    }
}

不会触发导航堆栈中的任何推送。该视图似乎根本没有交互性。如果有人找到解决方法就好了,除非苹果记录了这种行为,否则我会认为它在 beta 4 之前就被破坏了。

swift swiftui
8个回答
22
投票

Xcode 版本 11.3(11C29) 中的导航链接似乎存在错误,我已向 Apple 报告了该错误。

注意: 此问题仅出现在模拟器中。它在真实设备上运行良好。感谢@djr

以下代码在您第一次使用导航链接时按预期工作。不幸的是,第二次它变得没有反应。

import SwiftUI

struct ContentView : View {
    var body: some View {
        NavigationView {
            VStack {
                NavigationLink(destination: SomeView()) {
                    Text("Hello!")
                }
            }
        }
    }
}

struct SomeView: View {
    var body: some View {
        Text("Detailed View")
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

18
投票

您实际上在 NavigationView 内吗?以下作品。但如果我错过了你的观点,也许你可以分享更多代码。

import SwiftUI

struct ContentView : View {
    var body: some View {
        NavigationView {
            VStack {
                NavigationLink(destination: SomeView()) {
                    Text("Go!")
                }
            }
        }
    }
}

struct SomeView: View {
    var body: some View {
        Text("Detailed View Here!")
    }
}

0
投票

导航链接

按下时触发导航演示的按钮。这是pushViewController的替代品

NavigationView {
    NavigationLink(destination:
        Text("Detail")
        .navigationBarTitle(Text("Detail"))
    ) {
        Text("Push")
    }.navigationBarTitle(Text("Master"))
}

或者通过将组目标使用到它自己的视图 DetailView 中来使其更具可读性

NavigationView {
    NavigationLink(destination: DetailView()) {
        Text("Push")
    }.navigationBarTitle(Text("Master"))
}

0
投票

在 Xcode 11.3.1 中,我遇到了同样的问题,但我只需退出 Xcode 并重新启动计算机即可。这显然解决了一个问题(当然现在是 2021 年),但我能够按照苹果的 swiftui 教程进行操作,没有任何问题。我复制了这段代码并尝试了一下......对我来说效果很好。也许问题是您屏幕右下角的“播放”按钮已切换。


0
投票

试试这个:

 VStack{
     NavigationLink(destination: DetailView()) {
         Text("Push")
     }.navigationBarTitle(Text("Your Text")).isDetailLink(false)
 }

0
投票

将您的 NavigationLink 放入 NavigationStack 中。

struct GenreBadge : View {
@EnvironmentObject var store: Store<AppState>
let genre: Genre

var body: some View {
    NavigationStack {
       NavigationLink(destination: MoviesGenreList(genre: genre).environmentObject(store)) {
         RoundedBadge(text: genre.name)
         }
    }
 }

}


0
投票

我在 NavigationLink 内的视图有一个自定义的 onPress 属性,该属性覆盖了 NavigationLink 按。删除自定义 onPress 处理程序解决了该问题。

var listView: some View {
        LazyVGrid(columns: [GridItem(.flexible()), GridItem(.flexible())]) {
            ForEach(data, id: \.self) { d in
                NavigationLink(value: d) {
                    SomeView(
                        onPress: { // Remove this onPress in SomeView, to remove onTap conflict
                            handleOnPress()
                        }
                    )
                    .frame(height: 264)
                }
            }
        }
        .navigationDestination(for: dataModel.self) { d in
            ViewToPush(data: d)
        }
    }

-2
投票

试试这个:-

var body: some View {
        NavigationView {
        ZStack {
            NavigationLink(destination: YourView()) {
                Text("Go!")
            }
         }

        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.