SwiftUI两个克隆视图表现异常:添加按钮不显示问题
问题分析与解决
你遇到的问题核心原因是Toolbar修饰符的作用范围错误:两个视图里,添加按钮的.toolbar都绑定在了ForEach组件上。当listOfContacts为空时,ForEach会被SwiftUI自动隐藏,连带它的Toolbar也一起消失;而QualifiersMainView的listOfQualifiers有数据,ForEach正常显示,所以Toolbar能正常出现。
修复步骤
把添加按钮的Toolbar移到NavigationView或List的顶层层级,确保无论列表是否为空,Toolbar都能被渲染:
修改后的ContactsMainView代码
import SwiftUI struct ContactsMainView: View { @Environment(\.managedObjectContext) private var viewContext @Environment(\.presentationMode) var returnToMain @EnvironmentObject var contactVM: ContactViewModel @FetchRequest(entity: ContactEntity.entity(), sortDescriptors: [NSSortDescriptor(key: "contactLastName", ascending: true)], animation: .default) private var listOfContacts: FetchedResults<ContactEntity> @State private var addView = false @State private var isEdit = false @State private var totalContacts: Int = 0 var body: some View { NavigationView { List { Text("Total Contacts: \(totalContacts)") .foregroundColor(.green) .bold() ForEach(listOfContacts) { contact in ContactListCell(contactItem: contact, addView: false) } .sheet(isPresented: $addView) { ContactAddView(addView: $addView, isEdit: $isEdit) .onAppear { countContacts() } } } .navigationTitle("Contacts") // 将添加按钮的Toolbar移到List层级 .toolbar { Button(action: { contactVM.contactFirstName = "" contactVM.contactLastName = "" contactVM.contactItem = nil addView.toggle() }, label: { Label("Add Contact", systemImage: "plus.circle") }) } .navigationViewStyle(.stack) .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Button(action: { returnToMain.wrappedValue.dismiss() }, label: { Image(systemName: "xmark.circle") .foregroundColor(.blue) .font(.headline) .padding(20) }) } } .onAppear { countContacts() } } } func countContacts() { totalContacts = listOfContacts.count } }
额外建议
- 建议同步修改
QualifiersMainView的Toolbar位置,避免后续列表为空时出现同样的隐藏问题。 - 可以检查
ContactEntity的Core Data实体配置,确保FetchRequest能正常读取数据(不过当前问题的核心是Toolbar的作用范围)。
内容的提问来源于stack exchange,提问作者Bruckner
相关产品推荐
相关产品推荐

