ストーリーボード未使用で開発しています。
やっていること
下記コード①のstruct Aとstruct B内のdictionaryを作り、
userNameのみを登録または変更するビューにあるUITextFieldと、
userNameとhogeを登録または変更するビューにあるUITextFieldを使って、
FireStoreに登録される様にしています。
//下記コード① import Foundation import Firebase struct A { var userName :String var dictionaryA:[String:Any] { return ["userName":userName ]} } struct B { var userName :String var hoge :String var dictionaryB:[String:Any] { return ["userName" : userName, "hoge" : hoge ]} } extension A { init?(dictionaryA:[String:Any]) { guard let userName = dictionaryA["userName"] as? String else {return nil} self.init(userName: userName as String) } } extension B { init?(dictionaryB:[String:Any]) { guard let userName = dictionaryB["userName"] as? String else {return nil} guard let hoge = dictionaryB["hoge"] as? String else {return nil} self.init(userName: userName as String, hoge: hoge as String) }
実現したいこと
var userNameは共通したインスタンスとして扱いたいので、
いろんな異なるビューでuserNameを変更しても、FireStoreではもちろん1つしか"userName":Stringが存在しないようにしたいです。
もしかしたらこれは出来ているかもしれませんが、分からないことがあります。
やっていて分からないこと
下記コード③から下記コード②へモーダル遷移します。
下記コード②はuserNameとhogeを変更できるビューで、変更します(FireStoreのsetDataを使う)。
変更後下記コード③へ戻ります(dismiss)。
ここまでは下記コード③のUILabelに変更後のuserNameとhogeの値を表示できていますが、
いったん全く別のビューへ1度遷移して、そこから再度下記コード③へ遷移し、
同じ様に変更して下記コード③へ戻る(dismiss)と、
⚠️クラッシュ(Thread 1: signal SIGABRT)します。
reasonが無いため自分では原因が分かりませんでした。
原因
これは共通のインスタンスとして扱えてないからでしょうか?
原因が分からない為質問致します。
よろしくお願いします。
userNameとhogeの値を登録または変更するビューです //下記コード② import UIKit import Firebase class HenkouModalViewController: UIViewController, UITextFieldDelegate { ...省略 func henkou() { let db = Firestore.firestore() let b = B(userName: userNameField.text!, hoge: hogeField.text!) db.collection("users").document().setData(b.dictionaryB) ...省略
省略してますが、ラベルがあり変更後の値を表示しているビューです //下記コード③ class HenkougoViewController: UIViewController { ...省略 var a : A? var b : B? var dataListener : ListenerRegistration! override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) let userRef = db.collection("users").document() dataListener = userRef.addSnapshotListener { [unowned self] (docSnapshot, error) in guard let docSnapshot = docSnapshot, docSnapshot.exists else {return} //⚠️クラッシュの原因 Thread 1: signal SIGABRT if let b = B(dictionaryB: docSnapshot.data()!){ self.userNameLabel.text = b.userName self.hogeLabel.text = b.hoge } if let a = A(dictionaryA: docSnapshot.data()!) { self.userNameLabel.text = a.userName } } } ...省略
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。