【问题标题】:SwiftUI: NavigationView/List with programmatic selection under macOSSwiftUI:在 macOS 下具有编程选择的 NavigationView/List
【发布时间】:2022-03-02 08:23:55
【问题描述】:

我有一个 NavigationView/List 组合,可以进行编程选择。基本概念与此处描述的类似:https://www.hackingwithswift.com/quick-start/swiftui/how-to-use-programmatic-navigation-in-swiftui

有这么多东西,这在 iOS 上运行良好,但在 macOS 上存在一个问题:NavigationView 中的 EmptyView 在选择项目后立即变得可见:

有人知道如何删除这个不需要的 EmptyView() 吗?

这是一个演示项目:

struct ContentView: View {
    @ObservedObject private var state = State()

    var body: some View {
        NavigationView {
            VStack {
                List(state.items, id: \.self, selection: $state.selected) { item in
                    Text(item)
                        .buttonStyle(.borderless)
                }

                // navigation to the detail view if an item is selected
                if let selected = state.selected {
                    NavigationLink(
                        destination: Text(selected),
                        isActive: state.hasSelectionBinding
                    ) {
                        EmptyView()
                    }
                }
            }
        }
    }
}

class State: ObservableObject {
    @Published var items: [String] = ["Item 1", "Item 2", "Item 3"]
    @Published var selected: String?

    var hasSelectionBinding: Binding<Bool> {
        Binding(
            get: { self.selected != nil },
            set: {
                if $0 == false {
                    self.selected = nil
                }
            }
        )
    }
}

编辑 1:我尝试将 NavigationLink 放入堆栈上的背景修饰符,但现在“空视图”出现在“项目 3”旁边:

    var body: some View {
        NavigationView {
            VStack {
                List(state.items, id: \.self, selection: $state.selected) { item in
                    Text(item)
                        .buttonStyle(.borderless)
                }
                
            }
            .background(Group {
                // navigation to the detail view if an item is selected
                if let selected = state.selected {
                    NavigationLink(
                        destination: Text(selected),
                        isActive: state.hasSelectionBinding
                    ) {
                        EmptyView()
                    }
                }
                
            })
        }
    }

【问题讨论】:

  • 放到.background
  • @loremipsum:我刚刚尝试将带有 NavigationLink 的块放入 VStack 的背景中,但现在“EmptyView”出现在列表的最后一项旁边。
  • 向您的问题添加一个编辑部分,显示您刚刚尝试的内容。
  • @Yrb:刚刚更新了一个编辑部分。
  • 我认为这是一个错误。 init(destinationName:isActive:label:) 初始化程序显示幻影图像。 NavigationLink(_:tag:selection:destination:) 没有。

标签: swift macos swiftui


【解决方案1】:

您可以在您的第一个 ContentView 代码中尝试此解决方法:

NavigationLink("",                // <--- here
    destination: Text(selected),
    isActive: state.hasSelectionBinding
).position(x: 9999, y: 9999)     // <--- here

不需要EmptyView()。 注意,我建议你重命名你的 State 模型,因为 SwiftUI 已经有一个 State 结构。

【讨论】:

  • 有趣的解决方法,但不幸的是它不适用于我的实际应用程序。在那里,我多了一层导航。我在 1 级使用侧边栏,然后是列表,第三级是详细视图。使用此解决方法,只要您选择一个项目,列表列就会被拆分。这可能是另一个细节视图。
  • 我的答案中的代码对我有用。你是说它不适合你吗?或者您显示的代码不代表您的问题?你用的是什么系统?
  • 我显示的代码是一个简化版本,显示的问题与我的真实代码相同。它与简化的示例完美结合。不幸的是,我无法发布我的真实代码,因为它太复杂了。
  • 你可以试试其他修饰符,比如.scaleEffect(0.0001)而不是position(..)。但是我觉得您是说,无论提出什么解决方案,在您提供的代码中解决问题都不会在您的“真实”代码中起作用。
  • 我会试试的。似乎我在真实代码中的额外导航级别导致了更多问题。我还在调查。不过还是感谢您的帮助,非常感谢。
猜你喜欢
  • 2023-04-07
  • 2020-11-11
  • 2020-04-09
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 2020-04-11
  • 1970-01-01
  • 2020-08-29
相关资源
最近更新 更多