我有一个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的一个错误。
有什么想法或建议吗?
.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()
}
}
“ fix”。
我创建一个@State private var toggleMe: Bool! = false
,并在需要状态更改时调用toggleMe.toggle()
来切换它。有时会更新UI我停止使用状态并创建自定义OberveableObject like in this tutorial,因为这样我就可以通过调用
它们只是处理SwiftUI已显示的一些稳定性问题的一种方法,因为它是新的]objectWillChange.send()
来手动通知状态何时会更改,并且由于某些原因,似乎比更改State var
更好。