如何禁用 SwiftUI 的默认行为?

Posted

技术标签:

【中文标题】如何禁用 SwiftUI 的默认行为?【英文标题】:How to disable SwiftUI's default behavior? 【发布时间】:2019-08-26 13:51:14 【问题描述】:

SwiftUI 让构建声明式 UI 变得非常容易。然而,有时他们假设默认值不一定是我们想要的。

示例:

在列表行中添加两个按钮时,SwiftUI 会自动使整行可触摸,并且在行点击时会调用两个按钮的操作。这是默认行为,正如他们的 WWDC 视频中所展示的那样。

但我不希望这种行为。我希望两个按钮都能正常工作,并且该行不可点击。

问题:

我们如何告诉我们的鳄梨酱专家(使用 WWDC 参考)停止假设我希望我的列表(或任何其他行为)如何工作?

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

如果不需要List 的默认行为,您可以使用VStack

struct ContentView: View 
    var body: some View 
        VStack 
            Button(action: 
                print("foo")
            ) 
                Image(systemName: "photo")
            
            Button(action: 
                print("bar")
            ) 
                Image(systemName: "photo")
            
        
    

但是,如果确实需要List,则可以通过编写自定义ListStyle来进行自定义。

(也看看这个问题:How to change ListStyle in List。)

似乎SomethingStyle protocol 是 Apple 希望开发人员用来修改原生 SwiftUI 元素/行为的方式。另一个例子是ButtonStyle 或TextFieldStyle 等。

【讨论】:

在这个特定的示例中,是的,我确实需要某些行的列表默认行为。但是对于其他行,我需要默认行为处于非活动状态(这样两个按钮才能正常工作)。也就是说,这个问题有点笼统,因为我想知道如何在 SwiftUI 中的任何地方停止默认行为。 我明白了。在这种情况下,您可以使用ListStyle / ButtonStyle 等。我相应地更新了我的答案,请看一下。 太棒了!我会试一试,然后回复你。谢谢,@backslash-f! 可以创建自己的符合ButtonStyle 的类型。无法创建符合ListStyle 的您自己的类型。您必须使用 Apple 提供的符合 ListStyle 的类型之一。【参考方案2】:

我的印象是 Apple 想要强制执行他们的风格指南。另外要添加到@backslash-f 答案中,您也可以只使用 for each 而不是列表,这将为您提供类似的效果并允许更多自定义。

struct doubleList: View 
    var body: some View 
        VStack
            ForEach(1 ..< 10) index in
               Button(action: 
                   print("foo")
               ) 
                   Image(systemName: "photo")
                   
               
           
       

另一个尝试的选择是将UITableView 包装成UIViewRepresentable 并尝试以这种方式启用按钮

似乎可以通过点击手势来解决这个问题

Image(systemName: "photo")
.gesture(TapGesture().onEnded() 
                print("action2")
                )

【讨论】:

我也有这种印象,主要是为了帮助加快开发速度。但他们也说创建自定义功能很容易,但并非所有事情都如此。我试图避免将 UIKit 引入解决方案,但我想这是一种方法。感谢您的意见,@yawnobleix。 @R.Farias 我没有使用按钮尝试手势,而是添加了更多细节

以上是关于如何禁用 SwiftUI 的默认行为?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 列表禁用单元格按下

更改选项卡式视图栏颜色 SwiftUI

GetOrgChart:如何禁用单击转到详细信息视图的默认行为?

如何禁用log press cordova android的默认行为

Catalyst 'SwiftUI.AccessibilityNode' 不是已知的可序列化元素

按返回键“不”关闭软件键盘 - SwiftUI