ios - 在 Else 块中访问 ObservableObject 时视图不更新
问题描述
当我更改其值时,我的详细信息View
不会更新。@Binding
struct ContentView: View {
class ViewModel: ObservableObject {
@Published var imageSize: ImageSize?
@Published var anotherValue: Int? = 5
var cancellable: AnyCancellable?
init() {
cancellable = $imageSize.sink(receiveValue: { imageSize in
print(" \(imageSize?.rawValue ?? "Unknown")")
})
}
}
@ObservedObject private var viewModel = ViewModel()
var body: some View {
NavigationView {
List {
if viewModel.anotherValue == nil {
Text("Another value is nil")
} else {
NavigationLink(destination: SelectImageSizeView(selectedImageSize: $viewModel.imageSize)
.navigationBarTitle("ImageSize", displayMode: .inline)) {
Text("ImageSize: \(viewModel.imageSize?.rawValue ?? "Not Set")")
}
}
}
}
}
}
struct SelectImageSizeView: View {
@Binding var selectedImageSize: ImageSize?
var body: some View {
List{
ForEach(ImageSize.allCases, id: \.self) { imageSize in
HStack {
Button {
withAnimation {
self.selectedImageSize = imageSize
}
} label: {
HStack {
Text(imageSize.rawValue)
Image(systemName: imageSize == selectedImageSize ? "checkmark.circle.fill" : "circle")
}
.font(.title)
}
}
}
}
}
}
public enum ImageSize: String, Codable, CaseIterable {
case small = "Small"
case medium = "Medium"
case large = "Large"
}
当我将to 移出块时,它确实有效:NavigationLink
if
NavigationView {
List {
if viewModel.anotherValue == nil {
Text("Another value is nil")
}
NavigationLink(destination: SelectImageSizeView(selectedImageSize: $viewModel.imageSize)
.navigationBarTitle("ImageSize", displayMode: .inline)) {
Text("ImageSize: \(viewModel.imageSize?.rawValue ?? "Not Set")")
}
}
}
我在这里错过了什么吗?
解决方案
嗯。我不知道为什么会这样。但是您可以转而忽略整个ViewModel
?
你必须把它放在你的ContentView
. fileprivate
如果您不想从其他文件访问它,我已经做到了。
为我工作。
fileprivate class ViewModel: ObservableObject {
@Published var imageSize: ImageSize?
@Published var anotherValue: Int? = 5
var cancellable: AnyCancellable?
init() {
cancellable = $imageSize.sink(receiveValue: { imageSize in
print(" \(imageSize?.rawValue ?? "Unknown")")
})
}
}
struct ContentView: View {
@StateObject private var viewModel = ViewModel()
var body: some View {
NavigationView {
List {
if viewModel.anotherValue == nil {
Text("Another value is nil")
} else {
NavigationLink(destination: SelectImageSizeView(viewModel: viewModel)
.navigationBarTitle("ImageSize", displayMode: .inline)) {
Text("ImageSize: \(viewModel.imageSize?.rawValue ?? "Not Set")")
}
}
}
}
}
}
struct SelectImageSizeView: View {
@ObservedObject fileprivate var viewModel: ViewModel
var body: some View {
List{
ForEach(ImageSize.allCases, id: \.self) { imageSize in
HStack {
Button {
withAnimation {
viewModel.imageSize = imageSize
}
} label: {
HStack {
Text(imageSize.rawValue)
Image(systemName: imageSize == viewModel.imageSize ? "checkmark.circle.fill" : "circle")
}
.font(.title)
}
}
}
}
}
}
public enum ImageSize: String, Codable, CaseIterable {
case small = "Small"
case medium = "Medium"
case large = "Large"
}
推荐阅读
- java - Lombok 的 @Builder 未检测到 Java 记录的字段
- google-app-engine - 尽管 app.yaml 中设置了过期时间,但 App Engine 并未缓存静态内容
- reactjs - 无法在反应创建应用程序项目中显示照片
- c++ - 将整数放入数组时出现意外值
- php - $number = preg_match('@[AZ]@', $password); 中的“@[AZ]@”模式是什么意思?
- docker - 未在 Dockerfile ENTRYPOINT 中读取日期
- r - R ifelse 语句忽略输入
- npm - 使用 npm 安装 gulp 时不推荐使用的软件包
- java - 如何为 lombok Builder 生成吸气剂?
- python - 在 Jupyter Notebook 中打开文件