SwiftUI-结构绑定不';无法按预期更新UI
我有一个SwiftUI问题,它看起来不像是被回答的,或者是另一个问题的重复,SwiftUI是一个新问题 以下代码,以我的理解,显示切换按钮控件的背景。like的数量会按预期增加,但状态更改似乎不会传递到Book结构 我读到的所有内容都是,在预览中,您需要使用: PreviewProvider视图中的SwiftUI-结构绑定不';无法按预期更新UI,swift,xcode,binding,swiftui,Swift,Xcode,Binding,Swiftui,我有一个SwiftUI问题,它看起来不像是被回答的,或者是另一个问题的重复,SwiftUI是一个新问题 以下代码,以我的理解,显示切换按钮控件的背景。like的数量会按预期增加,但状态更改似乎不会传递到Book结构 我读到的所有内容都是,在预览中,您需要使用: PreviewProvider视图中的.constant(x) 但是,它不起作用,带有like的按钮不显示前景,也不显示背景色 调试应用程序时,书isLiked的结果会发生变化。但前景色/背景色则不然 下面是视图的代码 import Sw
.constant(x)
但是,它不起作用,带有like的按钮不显示前景,也不显示背景色
调试应用程序时,书isLiked的结果会发生变化。但前景色/背景色则不然
下面是视图的代码
import SwiftUI
struct BookDetailView: View {
@Binding var book: Book
@State var likes: Int = 0
var body: some View {
VStack {
Text(book.title)
Image(book.imageName)
.resizable()
.aspectRatio(contentMode: .fit)
.scaledToFit()
Button(action: {
self.book.isLiked.toggle()
self.likes = self.likes + 1
}) {
Text("I cannot test because there is no Book type provided, but if it is a struct, the following should work (note: .constant
binding is constant, it does not modify wrapped value, you need alive one)
struct BookDetailView_Previews: PreviewProvider {
struct TestView: View {
@State private var book = Book.demoBooks.randomElement()!
var body: some View {
BookDetailView(book: $book)
}
}
static var previews: some View {
TestView()
}
}
导入快捷界面
结构BookDetailView:视图{
@装订书籍:书籍
@状态变量:Int=0
var body:一些观点{
VStack{
正文(书名)
图像(book.imageName)
.可调整大小()
.aspectRatio(内容模式:.fit)
.scaledofit()
按钮(操作:{
self.book.isLiked.toggle()
self.likes=self.likes+1
}) {
Text(我无法测试,因为没有提供图书类型,但是如果它是一个结构,那么以下应该可以工作(注意:。常量
绑定是常量,它不会修改包装的值,您需要一个活动的值)
更新:现在修复-原因是使equalable book不考虑已更改的Islike状态,因此view不会检测到任何更改,也不会更新
解决方案是删除该扩展名或使其考虑所有应指示修改值的字段,如下所示
使用Xcode 11.4/iOS 13.4测试并运行,您的代码看起来不错,对状态概念的理解、使用和实现也不错
奇怪的是,这种情况也发生在我身上。有时候,State var无法重新加载视图,我相信这是因为SwiftUI不稳定。我有几种方法来“修复”它
我创建了一个@State private var toggleMe:Bool!=false
,并调用toggleMe.toggle()
在需要更改状态时进行切换。这有时会更新UI
我停止使用状态并创建一个自定义的obervableobject,因为这样我就可以通过调用objectWillChange.send()
手动发出状态将发生变化的信号,而且由于某种原因,它似乎比更改状态变量更好
对于您的案例,这些建议都不是好的做法。它们只是处理SwiftUI显示的一些稳定性问题的一种方法,因为它是新的我添加了book模型。它是一个结构。也许我需要将其设为类并将其更改为符合ObservieObject?但这只会使任何数据类型都是dynamic始终是一个类,这使得swift ui的概念比我想象的要复杂得多。添加代码并没有解决问题,book按钮打开一次,然后再也不会关闭。就像视图重画只触发一次…很棒的发现!标记为正确答案。似乎Equalable函数会通知您结构中的变化。好东西。否(2)这正是我想我下一步要去的地方。我不确定这是否是SwiftUI的一个限制,一个现有的bug,或者它是如何设计的。显然,ObserveObject和ObserveObject似乎是强制进行此更新的方式。我想如果你做了大量表单更新,它会让整个结构件变得毫无意义它用于将数据馈送到视图中。环顾四周后,我找不到一个原因来解释为什么在一个视图中有一个@State
,并将其作为@Binding
传递到一个提取视图中,在更改绑定的值后,状态的值第一次不会更改。如果连续两次更改,它会工作,但不会这对我不起作用。传入一个objectWillChange
publisher并调用它的send为我解决了这个问题。
extension Book: Equatable {
static func == (lhs: Book, rhs: Book) -> Bool {
lhs.id == rhs.id && lhs.isLiked == rhs.isLiked
}
}