SwiftUI:NavigationLink 内的水平 ScrollView 会中断导航

Posted

技术标签:

【中文标题】SwiftUI:NavigationLink 内的水平 ScrollView 会中断导航【英文标题】:SwiftUI: horizontal ScrollView inside NavigationLink breaks navigation 【发布时间】:2020-10-26 20:23:22 【问题描述】:

我想在List 中使用简单的水平ScrollView 作为NavigationLink。但是,点击ScrollView 并没有被NavigationLink 注册,因此不会导航到目的地。

NavigationView 
    List 
        NavigationLink(destination: Text("Detail")) 
            ScrollView(.horizontal) 
                Text("Tapping here does not navigate.")
            
        
    

关于如何防止ScrollView 捕获导航点击手势的任何想法?

【问题讨论】:

【参考方案1】:

您可以将NavigationLink移动到background并在onTapGesture中激活它:

struct ContentView: View 
    @State var isLinkActive = false
    
    var body: some View 
        NavigationView 
            List 
                ScrollView(.horizontal) 
                    Text("Tapping here does not navigate.")
                
                .onTapGesture 
                    isLinkActive = true
                
            
            .background(
                NavigationLink(destination: Text("Detail"), isActive: $isLinkActive) 
            )
        
    

【讨论】:

这行得通,但这是我已经知道的黑客/解决方法,并试图通过潜在的本机方法来避免。谢谢! @damirstuhec 您在问题中尝试的内容看起来应该(可能)是 native 方式。但它不是(至少在 SwiftUI 2 中)。所以你可能仍然需要使用变通方法/黑客(就像你经常使用 SwiftUI 一样)。 同意。感觉就像一个错误,所以让我们希望它尽快修复。我提交了反馈。【参考方案2】:

最终目标尚不明确,但以下替代方案也确实有效(使用 Xcode 12 / ios 14 测试)

NavigationView 
    List 
        ScrollView(.horizontal) 
            NavigationLink(destination: Text("Detail")) 
                Text("Tapping here does not navigate.")
            
        
    

【讨论】:

这行得通,但是,我简化了我的问题示例有点太多了。实际上,我想要一个导航链接行,其中包含除滚动视图之外的其他视图。正如您所建议的,将 ScrollView 移到 NavigationLink 之外会使整行内容滚动,这不是我想要的。

以上是关于SwiftUI:NavigationLink 内的水平 ScrollView 会中断导航的主要内容,如果未能解决你的问题,请参考以下文章

NavigationLink 内的 tvOS 按钮不起作用

SwiftUI NavigationLink 如何到达另一个 SwiftUI 页面?

NavigationLink 中的 SwiftUI 按钮

SwiftUI:NavigationLink 奇怪的行为

SwiftUI 上的 NavigationLink 两次推送视图

有没有办法向 NavigationLink 添加额外的功能? SwiftUI