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 中不起作用?

多行文本在 SwiftUI 列表内的 NavigationLink 中不起作用

TabView 选择在 SwiftUi Playground 中不起作用