質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

872閲覧

RealmSwiftで削除したデータをリストからリアルタイムで消したい

Natsu.mikan

総合スコア6

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/04/05 04:11

RealmSwiftを使ってアプリを作成しています。

データを削除して、リストから削除したアイテムを消したいのですが、表示されてしまいます。
どうすれば非表示にできますか?

データの更新や追加は反映されました。

swift

1struct ListView: View { 2 @ObservedObject private var fetcher = Fetcher() 3 4 var body: some View { 5 NavigationView { 6 VStack { 7 ForEach(self.fetcher.items) { (item: Item) in 8 NavigationLink(destination: DetailView(id: item.id)) { 9 Text(item.title) 10 } 11 } 12 } 13 } 14 } 15} 16 17struct DetailView: View { 18 var id: String 19 @ObservedObject private var fetcher = Fetcher() 20 @Environment(.presentationMode) private var presentationMode: Binding<PresentationMode> 21 22 var body: some View { 23 VStack { 24 Button(action: { 25 self.presentationMode.wrappedValue.dismiss() 26 self.fetcher.delete(id: self.id) 27 }) { 28 Text("Delete") 29 } 30 } 31 } 32} 33 34class Fetcher: ObservableObject { 35 var realm = try! Realm() 36 var objectWillChange: ObservableObjectPublisher = .init() 37 private(set) var items: Results<Item> 38 private var notificationTokens: [NotificationToken] = [] 39 40 init() { 41 items = realm.objects(Item.self) 42 43 notificationTokens.append(items.observe { _ in 44 self.objectWillChange.send() 45 }) 46 } 47 48 func delete(id: String) { 49 guard let item = realm.objects(Item.self).filter("id == '(id)'").first else { return } 50 51 try! realm.write() { 52 realm.delete(item) 53 } 54 } 55} 56 57class Item: Object, Identifiable { 58 @objc dynamic var id = NSUUID().uuidString 59 @objc dynamic var title = "" 60 @objc dynamic var createdAt = NSDate() 61 62 override static func primaryKey() -> String? { 63 return "id" 64 } 65}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

質問に示されているコードはデータを追加する処理がなかったので、Realmをインストールしたプロジェクトを新規作成した上でContentViewを次のようにして

swift

1import SwiftUI 2import Combine 3import RealmSwift 4 5struct ContentView: View { 6 @State var title = "" 7 8 var body: some View { 9 VStack { 10 TextField("タイトルを入力", text: $title) { 11 let item = Item() 12 item.title = self.title 13 let realm = try! Realm() 14 try! realm.write { 15 realm.add(item) 16 } 17 self.title = "" 18 } 19 ListView() 20 } 21 } 22}

これに質問のコードを加えて実行したら、正常に追加/削除され、リストもリアルタイムに反映されました。なので、コードは特に問題ないように思えます。

使用環境は

  • Xcode11.4
  • iOS13.4(iPhone11 Pro Max iOSシミュレータ)
  • RealmSwift4.4.0

です。

Realmのバージョンが古すぎるととSwiftUIに対応できていない可能性がありますので、Realmのバージョンを最新の4.4.0にして試してみることをお勧めします。

投稿2020/04/07 15:14

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問