2

我对 SwiftUI 有疑问

有一个问题

  1. 首次启动视图中不出现黄色视图
  2. 移动到家,使应用程序进入后台模式
  3. 移动到应用程序(前台)
  4. 然后出现黄色视图

我在步骤 1 中捕获了视图层次结构。 左视图层次捕获,右设备视图捕获 (左侧是视图层次结构捕获,右侧是模拟器)

视图层次结构捕获显示黄色方块,但模拟器未显示黄色方块

我检查了视图面包屑,但两者都相同,所以我不知道。

我确定这不是网络问题。

出现黄色方块有两种方式

  1. 背景 -> 前景
  2. 显示警报 -> 解除警报

我不确定这是一个框架错误还是其他。

另外,是否有任何 API 可以打印 swiftUI 渲染请求成功或失败?

提前谢谢你,圣诞快乐!

在此处输入图像描述

(左边是黄色方块出现在模拟器上之前/右边是黄色方块出现在模拟器上之后)

编辑 - 添加示例代码

内容视图

import SwiftUI

struct ContentView: View {
    
    @ObservedObject var viewModel : viewModel
    @ObservedObject var params : otherViewModel
    var body: some View {
            HorizontalScrollView(viewModel: viewModel, someParmas: params)
                .padding(.leading, 24)
                .frame(width: UIScreen.main.bounds.width, height:400)
                .background(Color.red)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView(viewModel: viewModel(homeAPI: HomeAPI()), params: otherViewModel())
    }
}

import SwiftUI

struct HorizontalScrollView: View {
    
    @ObservedObject var viewModel: viewModel
    @ObservedObject var holder : otherViewModel
   
    private var homeHightlightRange: Range<Int> {
        return 0..<(viewModel.something?.somethingList?.count ?? 0)
    }
    
    init(viewModel: viewModel, someParmas: otherViewModel) {
        self.viewModel = viewModel
        self.holder = someParmas
    }
    
    var body: some View {
        VStack(spacing: 20) {
            HStack(spacing: 0) {
                Text("Merry christmas")
                    .font(.system(size: 24))
                    .foregroundColor(.white)
                    .bold()
                    .onTapGesture {
                        viewModel.getHighlight()
                    }
                Spacer()
            }
            
            ScrollView(.horizontal, showsIndicators: false, content: {
                HStack(alignment:.bottom, spacing: 14) {
                    ForEach(homeHightlightRange, id: \.self) { index in
                        Color.yellow.frame(width:200, height:300)
                    }
                }
            })
        }
        .frame(height: 339)
    }
}

struct HighlightView_Previews: PreviewProvider {
    static var previews: some View {
        HorizontalScrollView(viewModel: viewModel(homeAPI: HomeAPI()),someParmas: otherViewModel())
            .previewLayout(.sizeThatFits)
    }
}

homeHightlightRange 是通过 viewModel 从服务器获取的

4

1 回答 1

1

我想解决方案是ScrollView在 API 结果出现时有条件地添加,例如(未测试 - 在此处输入,因此可能存在拼写错误)

if viewModel.something?.somethingList?.count != 0 {
    ScrollView(.horizontal, showsIndicators: false, content: {
        HStack(alignment:.bottom, spacing: 14) {
            ForEach(homeHightlightRange, id: \.self) { index in
                Color.yellow.frame(width:200, height:300)
            }
        }
    })
}
于 2020-12-24T14:18:25.273 回答