我正在寻找一种方法来简化/重构SwiftUI视图中.onChange(of:)的添加,该视图有许多TextField。如果解决方案简洁,我还将把修饰符移到更靠近适当字段的位置,而不是在ScrollView的末尾。在这种情况下,所有.onChange修饰符调用同一个函数。
示例:
.onChange(of: patientDetailVM.pubFirstName) { x in
changeBackButton()
}
.onChange(of: patientDetailVM.pubLastName) { x in
changeBackButton()
}
// ten+ more times for other fields
我试过用“O”法。但没用:
.onChange(of:
patientDetailVM.pubFirstName ||
patientDetailVM.pubLastName
) { x in
changeBackButton()
}
这是我要调用的简单函数:
func changeBackButton() {
withAnimation {
showBackButton = false
isEditing = true
}
}
任何指导将不胜感激。Xcode 13.2.1 iOS 15
5条答案
按热度按时间dnph8jn41#
每当您复制代码时,您都希望将其向下移动一级,以便可以重用相同的代码。
这里有一个解决方案,父视图将保存一个变量,该变量将知道“名称”作为一个整体是否发生了变化。
h6my8fg22#
另一种方法是为
pubFirstName
和pubLastName
创建一个组合发布器。并在您的视图的
onReceive
上收听nameChanged
publisher所以你可以听名字或姓氏的变化。没有测试代码,但只是作为一个想法。
5kgi1eie3#
解决方案概述
我们扩展了
Binding
类型,以创建两个新方法,这两个方法都称为onChange
。这两个
onChange
方法都是为了在这样的情况下使用的:当Binding
示例的wrappedValue
属性通过其set
方法被更改(而不仅仅是 * 设置 *)时,您需要执行一些工作。第一个
onChange
方法不会将Binding
示例的wrappedValue
属性的新值传递给提供的更改时回调方法,而第二个onChange
方法确实为它提供了新值。第一个
onChange
方法允许我们重构:改为:
溶液
帮助程序代码
用法
解决方案的优势
1.它使onChange-callback非常靠近
Binding
示例提供给TextField/TextEditor/other类型的位置。1.它是通用的,而且用途非常广泛,因为它可以用于任何
Binding
示例,只要该示例具有符合Equatable
协议的任何类型的wrappedValue
属性。1.具有更改时回调的
Binding
示例看起来就像没有更改时回调的Binding
示例一样。因此,不需要对这些具有更改时回调的Binding
示例所提供的类型进行特殊修改以了解如何处理它们。View
、@State
属性、ObservableObject
、EnvironmentKey
、PreferenceKey
或任何其他类型,它只是在现有的Binding
类型中添加了几个方法--很明显,该类型已经在代码中使用过了......vuv7lop34#
这是我想到的一个相当枯燥的方法,显然,一旦你写好了定义
NameKeyPathPairs
结构体的代码,以及对Array
的扩展等,它就非常容易使用了。示例用法
.onChange帮助程序代码
示例的剩余代码
vbkedwbf5#
为什么不直接使用计算的var呢?