SwiftUI 视图出现延迟

Posted

技术标签:

【中文标题】SwiftUI 视图出现延迟【英文标题】:Delay in SwiftUI view appearing 【发布时间】:2021-12-28 01:28:25 【问题描述】:

我有一个显示两个计算字符串的视图。目前,我使用 .onAppear 计算字符串。但是在计算字符串之前视图不会呈现,让用户观看前一个视图 2 到 5 秒直到计算完成,并且永远不会显示进度条。 代码是:

struct CalculatingProgressView: View 
  var body: some View 
    ProgressView 
      Text("Calculating")
        .font(.title)
    
  


struct OffspringView: View 
  @State private var males: String = ""
  @State private var females: String = ""
  @State private var busy = true
  
  func determineOffspring() 

    let temp = theOffspring(of: sire, and: dam)
    males = temp.0
    females = temp.1
    
    busy = false
  
  
  var body: some View 
    Section(header: Text("Male Offspring")) 
      Text(males)
        .font(.callout)
    
    if busy 
      CalculatingProgressView()
    
    Section(header: Text("Female Offspring")) 
      Text(females)
        .font(.callout)
    
    .onAppear  determineOffspring() 
  

如何让视图使用进度条进行渲染,以便用户知道应用实际上正在执行某项操作?

【问题讨论】:

欢迎来到 Stack Overflow!请拨打tour 并查看:How do I ask a good question? 和How to create a Minimal, Reproducible Example。 determineOffspring 函数应该在您的模型中。该模型应该是一个ObservableObject,而被计算的后代应该是一个@Published 变量,它最初是nil。然后您可以在offspring 保持nil 时显示进度条。 【参考方案1】:

您的代码似乎对我有用。你可以试试这个方法 在计算 determineOffspring 时显示 CalculatingProgressView

var body: some View 
        if busy 
            CalculatingProgressView()
                .onAppear  determineOffspring() 
         else 
            Section(header: Text("Male Offspring")) 
                Text(males).font(.callout)
            
            Section(header: Text("Female Offspring")) 
                Text(females).font(.callout)
            
        
    
 

注意,determineOffspring 中的 theOffspring(...) 应该使用类似的完成闭包 以下,“等待”直到计算完成:

func determineOffspring() 
    theOffspring(of: sire, and: dam)  result in
        males = result.0
        females = result.1
        busy = false
    

【讨论】:

以上是关于SwiftUI 视图出现延迟的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 反向动画延迟移除

延迟 SwiftUI 中的转换

Swiftui NavigationView 计时器延迟

SwiftUI 放大手势()延迟

使自定义 SwiftUI 视图适应内置修饰符

当视图出现在 SwiftUI 中时禁用动画