You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 00:06:18