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
相关产品推荐
相关产品推荐

