微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI-按钮正确加载视图,但随后在视图之间反弹

如何解决SwiftUI-按钮正确加载视图,但随后在视图之间反弹

很明显,我做错了什么。我有以下三个视图。第一个是从获取请求中填充的客户列表。每行都是一个导航链接,可转到“客户详细信息视图”。这里有一个“ +”按钮,用于创建和保存新的报价对象,然后过渡到报价视图。但是,一旦这样做,“客户详细信息”视图就会再次意外加载,并立即被关闭到“客户列表”视图。

这种奇怪的行为是不一致的。事情经常会运作良好。而且,如果我注释掉makeQuoteNumber方法,该问题似乎已完全解决。我尝试将完成处理程序添加makeQuoteNumber方法中,因为它是在Quote视图出现之前被调用的,但这没有帮助。

views

客户列表

List {
   ForEach(customers
      .filter({searchText.isEmpty ? true :  //code for search bar
         $0.custName?.localizedCaseInsensitiveContains(searchText) ?? false })) { customer in
            NavigationLink(destination: CustomerDetailView(customer: customer)) {
               CustomerRow(customer: customer)
           }
           .id(self.refreshingID) //helps refresh list when a customer is added or edited.
       }
       .onDelete(perform: deleteCustomer)
   }

客户详细信息-添加按钮

vstack {
   NavigationLink(destination: QuoteView(quoteNumber: quoteNumber),isActive: $showQuoteView) { EmptyView() }
      Button(action: {
         self.CreateNewQuote(completion: {
            self.showQuoteView = true
         })
      }) {
         Image(systemName: "plus.circle.fill")
        }
    }

func CreateNewQuote(completion: () -> ()) {
        let newQuote = Quote(context: self.moc)
        newQuote.id = UUID()
        let quoteNumber = makeQuoteNumber(usingDate: Date())
        newQuote.quoteNumber = quoteNumber
        let title = "Quote for \(customer.custName ?? "")"
        newQuote.user = user.first
        newQuote.quoteTitle = title
        customer.addToQuotes(newQuote)
        appDelegate.saveContext()
        
        self.quoteNumber = quoteNumber
        
        completion()
    }

func makeQuoteNumber(usingDate date: Date) -> String {
    let seconds = date.datetoSeconds()
    let formatter = DateFormatter()
    formatter.dateFormat = "MMddyy"
    let formattedDate = formatter.string(from: date)
    let quoteNumber = "QQ\(formattedDate)-\(seconds)"
    
    return quoteNumber
}

func secondsFromDate(date: Date) -> Int {
    let calendar = Calendar.current
    var totalSeconds = 0
    
    let hours = calendar.component(.hour,from: date)
    totalSeconds = hours * 3600
    let minutes = calendar.component(.minute,from: date)
    totalSeconds += minutes * 60
    let seconds = calendar.component(.second,from: date)
    totalSeconds += seconds
    return totalSeconds
}

我可以显示Quote View的代码,但是作为调试的一部分,我用一个简单的文本视图替换了整个视图,并且行为相同。

解决方法

提供的代码不可测试,所以只是一个想法-尝试在延迟后激活链接

  Button(action: {
     self.CreateNewQuote(completion: {
        // DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // or this
        DispatchQueue.main.async {
           self.showQuoteView = true
        }
     })

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。