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

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

示例:

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

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

问题:

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

任何帮助将不胜感激。

【问题讨论】:

    标签: ios swiftui


    【解决方案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 元素/行为的方式。另一个例子是ButtonStyleTextFieldStyle 等。

    【讨论】:

    • 在这个特定的示例中,是的,我确实需要某些行的列表默认行为。但是对于其他行,我需要默认行为处于非活动状态(这样两个按钮才能正常工作)。也就是说,这个问题有点笼统,因为我想知道如何在 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 我没有使用按钮尝试手势,而是添加了更多细节
    猜你喜欢
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多