Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SwiftUI-结构绑定不';无法按预期更新UI_Swift_Xcode_Binding_Swiftui - Fatal编程技术网

SwiftUI-结构绑定不';无法按预期更新UI

SwiftUI-结构绑定不';无法按预期更新UI,swift,xcode,binding,swiftui,Swift,Xcode,Binding,Swiftui,我有一个SwiftUI问题,它看起来不像是被回答的,或者是另一个问题的重复,SwiftUI是一个新问题 以下代码,以我的理解,显示切换按钮控件的背景。like的数量会按预期增加,但状态更改似乎不会传递到Book结构 我读到的所有内容都是,在预览中,您需要使用: PreviewProvider视图中的.constant(x) 但是,它不起作用,带有like的按钮不显示前景,也不显示背景色 调试应用程序时,书isLiked的结果会发生变化。但前景色/背景色则不然 下面是视图的代码 import Sw

我有一个SwiftUI问题,它看起来不像是被回答的,或者是另一个问题的重复,SwiftUI是一个新问题

以下代码,以我的理解,显示切换按钮控件的背景。like的数量会按预期增加,但状态更改似乎不会传递到Book结构

我读到的所有内容都是,在预览中,您需要使用: PreviewProvider视图中的
.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
      }
    }