SwiftUI:检测 tvOS 上 NavigationView 中的选择更改

Posted

技术标签:

【中文标题】SwiftUI:检测 tvOS 上 NavigationView 中的选择更改【英文标题】:SwiftUI: Detecting selection change in NavigationView on tvOS 【发布时间】:2020-10-09 20:15:05 【问题描述】:

我正在为 tvOS 构建一个 SwiftUI 应用程序,目前正在尝试实现 UI。我在底部有 NavigationView,在顶部有标签,我希望标签显示当前处于焦点的 NavigationLink。这是我的代码:

@State private var selection: String? = nil

.

ZStack 

    Color.red.edgesIgnoringSafeArea(.all)

    VStack 

            Text(selection ?? "no value").background(Color.green)

            NavigationView 
                ScrollView(.horizontal) 
                    HStack

                        VStack 
                            NavigationLink(destination: view2, tag: "1", selection: $selection) 
                            Image("placeholder")
                                .scaledToFit().frame(width:400, height: 225) 
                            Text("Button")
                        

                        VStack 
                            NavigationLink(destination: view2, tag: "2", selection: $selection) 
                            Image("placeholder")
                                .scaledToFit().frame(width:400, height: 225) 
                            Text("Button")

                        

                        ...
                                                           

                    .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .bottomLeading)
                
             
            
  

但是,当我更改选择并且不显示任何值时,标签值不会改变:

有什么想法我应该在那里做什么?

【问题讨论】:

我在同一条船上 - 你找到解决方案了吗?我能想到的唯一方法是在 NavigationLink 上覆盖 .focusable() - 但随后 destination 不起作用 @beamercola 不,我没有☹️。不得不想出一个不同的用户界面 该死,太糟糕了。我已经很接近了,但有些事情告诉我 SwiftUI 还没有准备好。这是我的代码:***.com/questions/63950127/… 【参考方案1】:

我相信您的Image 会占用您的NavigationLink 的选择效果,一个简单的解决方法是将.padding() 添加到您的图像中。 Here 是一些很好的示例,您可以使用它来自定义 NavigationLink 选择。更具体地说是NavigationLink.buttonStyle

     var body: some View 
    ZStack 
        VStack
            NavigationView 
                ScrollView(.horizontal)
                    HStack(spacing: 90) 
                        VStack

                            NavigationLink(destination: ResultView(choice: "Chaka")) 
                                Image("chaka")
                                    .scaledToFit()
                                    .frame(width:400, height: 225)
                                    .padding(20)


                                Text("Choose Chaka")
                            
                        

                        VStack
                            NavigationLink(destination: ResultView(choice: "Dr Rick Marshall")) 
                                Image("rick_marshall")
                                    .scaledToFit().frame(width:400, height: 225)
                                    .frame(width:400, height: 225)
                                    .padding(20)

                                Text("Padding 20").foregroundColor(Color.white)

                             .buttonStyle(DefaultButtonStyle()) // buttonStyle allows for selection customiaztion ie color
                        

                        VStack
                            NavigationLink(destination: ResultView(choice: "Will Stanton")) 
                                Image("danny_mcBride")
                                    .scaledToFit().frame(width:400, height: 225)
                                    .frame(width:400, height: 225)


                                Text("No Padding").foregroundColor(Color.white)

                             .buttonStyle(DefaultButtonStyle())
                        
                    .padding(60) // allows for selection pop out effect to be seen
                
                .navigationBarTitle("Navigation")
            
        
    

【讨论】:

【参考方案2】:

试试这个:

    VStack 
        NavigationLink(destination: view2, tag: "2", selection: $selection) 
            Image("placeholder")
                .scaledToFit().frame(width:400, height: 225) 
            Text("Button")
        .onTapGesture selection = "2" 
    

onTapGesture 将覆盖 NavigationLink 上的点击,但效果相同。

【讨论】:

以上是关于SwiftUI:检测 tvOS 上 NavigationView 中的选择更改的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - tvOS 上的列表 - 顶部渐变

自定义按钮样式 (SwiftUI) tvOS

如何在 tvOS 中使 SwiftUI 列表可滚动

SwiftUI - tvOS 上的 AVPlayerViewController 全屏

在 TVOS 上的 SwiftUI 布局中苦苦挣扎

如何从 SwiftUI 中的 NavigationView 中删除搜索栏?