如何禁用 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 的默认行为?的主要内容,如果未能解决你的问题,请参考以下文章
GetOrgChart:如何禁用单击转到详细信息视图的默认行为?
如何禁用log press cordova android的默认行为