SwiftUI 条件在视图中不起作用
Posted
技术标签:
【中文标题】SwiftUI 条件在视图中不起作用【英文标题】:SwiftUI conditional doesn't work at top level in view 【发布时间】:2020-07-29 17:20:02 【问题描述】:我有一个看起来像这样的视图模型:
class SegmentViewModel: ObservableObject
@Published private(set) var itemIds = [Int]()
private var cancellables: Set<AnyCancellable> = []
init()
fetchIds()
private func fetchIds()
let request = URLRequest(path: "/ids")
network
.send(request)
.receive(on: DispatchQueue.main)
.sink completion in
switch completion
case .failure(let error): print(error.localizedDescription)
case .finished: break
receiveValue: response in
self.itemIds = response
.store(in: &cancellables)
一切正常,然后我的视图如下:
struct SegmentView: View
@ObservedObject var viewModel: SegmentViewModel
var body: some View
if viewModel.itemIds.isEmpty
ProgressView()
else
ScrollView
LazyVStack
ForEach(viewModel.itemIds, id: \.self) id in
ItemView(viewModel: ItemViewModel(itemId: id))
.cornerRadius(15)
.padding()
.shadow(radius: 3)
但这不起作用。 ProgressView
永远不会被隐藏并替换为 ScrollView
。但是,如果我将视图更改为:
struct SegmentView: View
@ObservedObject var viewModel: SegmentViewModel
var body: some View
ScrollView
if viewModel.itemIds.isEmpty
ProgressView()
else
LazyVStack
ForEach(viewModel.itemIds, id: \.self) id in
ItemView(viewModel: ItemViewModel(itemId: id))
.cornerRadius(15)
.padding()
.shadow(radius: 3)
然后它会按预期工作并在itemIds
不为空时隐藏ProgressView
。
这是为什么呢?
【问题讨论】:
【参考方案1】:看起来 ViewBuidler 消耗了该条件,因此未观察到它。我会在集团中脱颖而出
struct SegmentView: View
@ObservedObject var viewModel: SegmentViewModel
var body: some View
Group // << here !!
if viewModel.itemIds.isEmpty
ProgressView()
else
ScrollView
LazyVStack
ForEach(viewModel.itemIds, id: \.self) id in
ItemView(viewModel: ItemViewModel(itemId: id))
.cornerRadius(15)
.padding()
.shadow(radius: 3)
【讨论】:
在 VStack 而不是 Group 中?以上是关于SwiftUI 条件在视图中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
PickerView 被禁用并且在 SwiftUI 中不起作用
SwiftUI:为啥 ObservedObject 在 AppDelegate 中不起作用?
该功能在 UIViewControllerRepresentable 中不起作用
SwiftUI - 过渡动画在 GeoReader 中不起作用?