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

SwiftUI中.sheet首次打开时分类信息未传递的问题

问题:SwiftUI Sheet首次点击时分类信息未传递,显示错误界面

实现了带有滑动编辑按钮的分类列表功能,使用SwiftUI的.sheet弹出EditCategoryFormView编辑分类名称。但首次点击编辑按钮时,分类信息未传递,显示「カテゴリが選択されていません」(未选择分类)的错误界面;后续点击则能正常显示编辑界面。推测是.sheet的值传递方式存在问题,相关代码如下:

1. EditCategoryView2.swift

import SwiftUI
import RealmSwift


class MenuViewModel2: ObservableObject {
    private var realm: Realm
    @Published var uniqueCategories: [String] = []
    
    init() {
        do {
            realm = try Realm()
        } catch {
            print("Error initializing Realm: \(error)")
            realm = try! Realm(configuration: Realm.Configuration(inMemoryIdentifier: "TemporaryRealm"))
        }
        loadMenus()
    }
    
    func loadMenus() {
        let menus = realm.objects(Menu.self).map { $0 }
        let categories = Set(menus.map { $0.category })
        uniqueCategories = Array(categories).sorted()
    }
    
    func deleteCategory(category: String) {
        do {
            let objectsToDelete = realm.objects(Menu.self).filter("category == %@", category)
            try realm.write {
                realm.delete(objectsToDelete)
            }
            loadMenus() // リストを更新
        } catch {
            print("Error deleting category: \(error)")
        }
    }
    
}

struct EditCategoryView2: View {
    @ObservedObject var viewModel = MenuViewModel()
    @State private var selectedCategory: String?
    @State private var isEditingCategory = false // 新しいプロパティ
    
    
    
    var body: some View {
        NavigationStack {
            List(viewModel.uniqueCategories, id: \.self) { category in
                Text(category)
                    .swipeActions(edge: .trailing, allowsFullSwipe: false) {
                        // 編集ボタン
                        Button {
                            print("Editing \(category)")
                            selectedCategory = category
                            DispatchQueue.main.async {
                                    isEditingCategory = true
                                }
                            
                        } label: {
                            Label("Edit", systemImage: "pencil")
                        }
                        .tint(.blue)
                        
                    }
                
                
            }
            
            
        }
        .sheet(isPresented: $isEditingCategory) {
            if let category = selectedCategory {
                // EditCategoryFormView を表示
                EditCategoryFormView(
                    editedCategory: Binding<String>(
                        get: { category },
                        set: { selectedCategory = $0 }
                    ),
                    originalCategory: Binding<String>(
                        get: { category },
                        set: { _ in } // ここではoriginalCategoryを変更する必要はないので無視
                    ),
                    onEditCategory: {
                        viewModel.loadMenus()
                        isEditingCategory = false
                    }
                )
            } else {
                // カテゴリが選択されていない場合の処理
                Text("カテゴリが選択されていません")
            }
            
        }
    }
}

#Preview {
    EditCategoryView2()
}

2. EditCategoryFormView.swift

import SwiftUI
import RealmSwift

struct EditCategoryFormView: View {
    @Environment(\.presentationMode) var presentationMode
    @Binding var editedCategory: String // @Bindingで渡される
    @Binding var originalCategory: String
    var onEditCategory: () -> Void
    
    
    var body: some View {
        
        Form {
            TextField("カテゴリ名", text: $editedCategory)
            
        }
        Button("保存") {
            updateCategory()
            presentationMode.wrappedValue.dismiss()
        }
    }
    
    
    
    private func updateCategory() {
        print("更新対象のカテゴリ: \(originalCategory)")

        print("updateCategoryが呼び出されました。")
        let realm = try! Realm()
        let menusToUpdate = realm.objects(Menu.self).filter("category == %@", originalCategory)
        
        print("検索しているワード:\(originalCategory)")
        print("置換後のワード:\(editedCategory)")
        
        print("更新対象のカテゴリ数: \(menusToUpdate.count)")
        do {
            try realm.write {
                menusToUpdate.forEach { menu in
                    menu.category = editedCategory
                }
            }
            onEditCategory()
        } catch {
            print("カテゴリの更新中にエラーが発生しました: \(error)")
        }
    }
}

注:初始界面、首次点击错误界面、后续正常界面分别对应提供的截图。

内容的提问来源于stack exchange,提问作者takuma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 21:30:26