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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

1736閲覧

チャットアプリで文字を入力してチャット画面に送信したい。

wesker.alice

総合スコア45

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2020/04/23 22:36

編集2020/04/24 01:09

前提・実現したいこと

前提
http://crossbridge-lab.hatenablog.com/entry/2016/06/02/085726
上記のページ「Firebase を使って30分でiOSのチャットアプリを作ってみる(新SDK対応版)」を参考に記事の通りにコードの記述などをしていきました。

実現したいこと
シミュレーターでチャットを送信する

発生している問題・エラーメッセージ

イメージ説明

エラ〜メッセージではなく、エラーも出ていないのですが、シミュレーターを起動した際に、入力画面はきちんと表示されるのに、入力項目に入力したところ、「エンター」を押せば送信できるらしいのですが、エンターを押しても何も反応しません。

該当のソースコード

ViewController

1import UIKit 2import FirebaseCore 3import Firebase 4import FirebaseDatabase 5import FirebaseStorage 6 7class ViewController: UIViewController, UITextFieldDelegate { 8 9 @IBOutlet weak var textView: UITextView! 10 @IBOutlet weak var nameTextField: UITextField! 11 @IBOutlet weak var messageTextField: UITextField! 12 13 var ref:DatabaseReference! 14 var databaseRef:DatabaseReference! 15 16 override func viewDidLoad() { 17 super.viewDidLoad() 18 // Do any additional setup after loading the view. 19 20 databaseRef = Database.database().reference() 21 22 databaseRef.observe(.childAdded, with: { snapshot in 23 if let name = snapshot.value(forKey: "name") as? String, 24 let message = snapshot.value(forKey: "message") as? String { 25 self.textView.text = "(self.textView.text ?? "")\n(name) : (message)" 26 } 27 }) 28 29 } 30 31 32 33 func textFieldShouldReturn(_ textField: UITextField) -> Bool{ 34 35 let messageData = ["name": nameTextField.text!, "message": messageTextField.text!] 36 databaseRef.childByAutoId().setValue(messageData) 37 38 textField.resignFirstResponder() 39 messageTextField.text = "" 40 41 FirebaseApp.configure() 42 return true 43 } 44 45 46 47} 48 49 50 51

追記のソースコード

Appdelegate

1import UIKit 2import FirebaseCore 3import Firebase 4import FirebaseDatabase 5import FirebaseStorage 6 7 8 9@UIApplicationMain 10class AppDelegate: UIResponder, UIApplicationDelegate { 11 var window: UIWindow? 12 13 14 func application(_ application: UIApplication, 15 didFinishLaunchingWithOptions launchOptions: 16 [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 17 //ここから 18 return true 19 } 20 21 } 22 23 24 25 internal func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 26 // Override point for customization after application launch. 27 FirebaseApp.configure() //こちらに移動しました。 28 return true 29 30 } 31 32 // MARK: UISceneSession Lifecycle 33 34 func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 35 // Called when a new scene session is being created. 36 // Use this method to select a configuration to create the new scene with. 37 return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) 38 } 39 40 func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) { 41 // Called when the user discards a scene session. 42 // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. 43 // Use this method to release any resources that were specific to the discarded scenes, as they will not return. 44 }

試したこと

日本語、英数字を試してみましたが、ダメでした。
イメージ説明
イメージ説明
イメージ説明

補足情報(FW/ツールのバージョンなど)

MacOS Catalina ver10.15.3
Swift version 5.1.3
Xcode Version 11.4

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

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

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

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

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

guest

回答1

0

ベストアンサー

ViewController を messageTextField の delegate にする必要があります。方法は二つあって、

  1. コードで、viewDidLoad に messageTextField.delegate = self と書く
  2. Storyboard 上で messageTextField の delegate を設定

イメージ説明

投稿2020/04/23 23:16

hoshi-takanori

総合スコア7895

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

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

wesker.alice

2020/04/23 23:56

コードで、viewDidLoad に messageTextField.delegate = self と書く これは記述できました。 2つ目ですが、storyboard上でdelegateの紐付けを設定したのですが、 delegateの○をドラッグし、messageTextFieldまで持っていきドロップしました。 「delegate - messageTextField」として紐付けできたかなと思ったのですが、 左側のmessageTextFieldを選択すると右のdelegateの紐付けができていなく、 逆にnameTextFieldを選択して確認すると「delegate - messageTextField」として紐付けされていることが確認できます。 試したことの欄に 画像を追記添付しました。 シミュレーションで試したところ、今度はname部分の入力ができなくなり、メッセージ入力でエンターを押すとエラーが戻ってきました。 「Thread 1: Exception: "Default app has already been configured."」 'デフォルトアプリが既に設定されています。'とのことなのですが、いまいちどういうことか分かりません。 これまでに作っていたアプリが邪魔しているということでしょうか?
hoshi-takanori

2020/04/24 00:48

言葉が足らずごめんなさい。「方法が二つ」というのはどっちか片方でいいということで、両方やる必要はありません。 Storyboard 上での delegate の紐付けですが、nameTextField や messageTextField の delegate から ViewController にドラッグします。スクリーンショットを見ると、messageTextField が textView や nameTextField の delegate になってるようですが、これはおかしいですね。 また、Default app has already been configured というのは Firebase が出すエラーのようで、たぶん FirebaseApp.configure を textFieldShouldReturn に書いたためにエンターを押すたびに FirebaseApp.configure が呼ばれてしまうためだと思います。FirebaseApp.configure はアプリ起動時に 1 回だけ呼ぶようにする必要があるので、AppDelegate の didFinishLaunchingWithOptions あたりに書くのがいいと思います。
wesker.alice

2020/04/24 01:24

Storyboard 上での delegate の紐付けを修正してみました。 もう一点の「AppDelegate の didFinishLaunchingWithOptions あたりに書くのがいいと思います。」について、FirebaseApp.configureの記述場所を変更したAppDelegateを追記で記述しました。 シミュレーションを起動してみたところ、クラッシュし、 「Thread 1: Exception: "Failed to get default Firebase Database instance. Must call `[FIRApp configure]` (`FirebaseApp.configure()` in Swift) before using Firebase Database."」というエラーが出てきました。 didFinishLaunchingWithOptions が2箇所あるのですが1つ目にFirebaseApp.configureを記述すると「Default app has already been configured」というエラーが表示され、 2つ目に記述すると「Thread 1: Exception: "Failed to get default Firebase Database instance. Must call `[FIRApp configure]` (`FirebaseApp.configure()` in Swift) before using Firebase Database."」というエラーが表示され、 両方に記述すると1つ目と同じエラーが表示されます。 もしかして書く位置が間違っているのかも知れません。。。。。 追記のソースコードを見ていただいてもよろしいでしょうか?
hoshi-takanori

2020/04/24 01:40

didFinishLaunchingWithOptions がふたつある…。ふたつ目はご自分で追加されましたか? 最初のやつだけで良いはずなので、そこに FirebaseApp.configure() を書いて、ふたつ目は消しましょう。 そして、たぶんどこか他でも FirebaseApp.configure() を呼んでる気がするので、探してみてください。
wesker.alice

2020/04/24 02:03

func application と internal func application の違いのものが記述されてました。 記述した記憶がないので二つ目は消しました。 その他にも呼んでるとのことだったので探してみたところ、ViewControllerで記述されていたので消しました。 再度、シミュレーターを起動して名前とメッセージを入力してエンターを押すと、入力したメッセージが画面に表示されずにメッセージ欄から消えました。→(おそらくデータベース に保存された?)と考えfirebaseのデータベース をみるも、チャットを飛ばした形跡は見当たりませんでした。 クラッシュやエラーが起きていないので、完成まであともう少しのようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問