如何解决SwiftUI-按钮正确加载视图,但随后在视图之间反弹
很明显,我做错了什么。我有以下三个视图。第一个是从获取请求中填充的客户列表。每行都是一个导航链接,可转到“客户详细信息视图”。这里有一个“ +”按钮,用于创建和保存新的报价对象,然后过渡到报价视图。但是,一旦这样做,“客户详细信息”视图就会再次意外加载,并立即被关闭到“客户列表”视图。
这种奇怪的行为是不一致的。事情经常会运作良好。而且,如果我注释掉makeQuoteNumber
方法,该问题似乎已完全解决。我尝试将完成处理程序添加到makeQuoteNumber
方法中,因为它是在Quote视图出现之前被调用的,但这没有帮助。
客户列表
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 举报,一经查实,本站将立刻删除。