SwiftUI-结构绑定未按预期更新UI

问题描述 投票:0回答:1

我有一个SwiftUI问题,看起来好像并没有回答,或者是另一个问题的重复,而SwiftUI相当新。

据我所知,以下代码显示切换Button控件的背景。点赞的次数按预期增加,但是状态更改似乎不会传递给Book结构。

我阅读的所有内容都是在预览中,您需要使用:PreviewProvider视图中的.constant(x)

但是,它不起作用,带有赞的按钮既没有前景,也没有背景颜色。

调试应用程序时,书的结果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("👍 Like \(likes)")
                .padding()
                .foregroundColor(self.book.isLiked ? .secondary : .primary)
                .background(self.book.isLiked ? Color.rayWenderlichGreen : Color.white)
                .cornerRadius(10)
        }
    }
  }
}

struct BookDetailView_Previews: PreviewProvider {

  static var previews: some View {
    BookDetailView(book: .constant(Book.demoBooks.randomElement()!))
  }
}

这里是实际的书籍模型

import SwiftUI

struct Book: Identifiable {
  var id = UUID()
  var title: String
  var imageName: String
  var isLiked = false
}

extension Book: Equatable {
  static func == (lhs: Book, rhs: Book) -> Bool {
    return lhs.id == rhs.id
  }
}

我花了一些时间试图理解为什么会发生这种情况,并且似乎只是SwiftUI的一个错误。

有什么想法或建议吗?

swift xcode binding swiftui swiftui-bug
1个回答
0
投票
注意:.constant绑定是常量,它不修改包装的值,您需要一个活着的东西)

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() } }


0
投票
奇怪的是,这也发生在我身上。有时,State var不会重新加载视图,我相信这是因为SwiftUI不稳定。我有几种方法

“ fix”。

我创建一个@State private var toggleMe: Bool! = false,并在需要状态更改时调用toggleMe.toggle()来切换它。有时会更新UI

    我停止使用状态并创建自定义OberveableObject like in this tutorial,因为这样我就可以通过调用objectWillChange.send()来手动通知状态何时会更改,并且由于某些原因,似乎比更改State var更好。
  1. 这些建议都不是您的情况的好习惯。
它们只是处理SwiftUI已显示的一些稳定性问题的一种方法,因为它是新的]

© www.soinside.com 2019 - 2024. All rights reserved.