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

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

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

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

Swift

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

Q&A

解決済

1回答

643閲覧

チャットアプリで画像の送信を可能にしたい

yotubarail

総合スコア23

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/05/28 01:10

編集2019/05/28 01:37

現在JSQMessagesViewControllerを用いて簡単なチャット機能を試してみようと考えています。
下の画像にあるような画面になっており左下のクリップマークをタップすることでカメラの起動や画像の選択ができるとようにしたいのですが、タップをしても何もアクションが起きない状態です。
もし解決方法がお分かりになる方がいらっしゃいましたらご教授いただけないでしょうか。

チャット画面

現在のコードはこのようになっております。

Swift

1コード 2import UIKit 3import JSQMessagesViewController 4import SwiftyJSON 5 6class ViewController: JSQMessagesViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 7 8 private var messages: [JSQMessage] = [] 9 private var incomingBubble: JSQMessagesBubbleImage! 10 private var outgoingBubble: JSQMessagesBubbleImage! 11 private var incomingAvatar: JSQMessagesAvatarImage! 12 // テスト用 13 private let targetUser: JSON = ["senderId": "targetUser", "displayName": "passion"] 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 initialSettings() 18 selectImage() 19 } 20 21 private func initialSettings() { 22 // 自分の情報入力 23 self.senderId = "self" 24 self.senderDisplayName = "自分の名前" 25 // 吹き出しの色設定 26 let bubbleFactory = JSQMessagesBubbleImageFactory() 27 self.incomingBubble = bubbleFactory!.incomingMessagesBubbleImage(with: UIColor.jsq_messageBubbleLightGray()) 28 self.outgoingBubble = bubbleFactory!.outgoingMessagesBubbleImage(with: UIColor.jsq_messageBubbleGreen()) 29 30 // 相手の画像設定 31 self.incomingAvatar = JSQMessagesAvatarImageFactory.avatarImage(with: UIImage(named: "sample_user"), diameter: 64) 32 // 自分の画像を表示しない 33 self.collectionView!.collectionViewLayout.outgoingAvatarViewSize = CGSize.zero 34 } 35 36 // 送信ボタンを押した時の挙動 37 override func didPressSend(_ button: UIButton!, withMessageText text: String!, senderId: String!, senderDisplayName: String!, date: Date?) { 38 let message = JSQMessage(senderId: senderId, displayName: senderDisplayName, text: text) 39 messages.append(message!) 40 // 更新 41 finishSendingMessage(animated: true) 42 43 sendAutoMessage() 44 } 45 46 // 表示するメッセージの内容 47 override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageDataForItemAt indexPath: IndexPath!) -> JSQMessageData! { 48 return self.messages[indexPath.item] 49 } 50 51 // 表示するメッセージの背景を指定 52 override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageBubbleImageDataForItemAt indexPath: IndexPath!) -> JSQMessageBubbleImageDataSource! { 53 if messages[indexPath.item].senderId == senderId { 54 return self.outgoingBubble 55 } 56 return self.incomingBubble 57 } 58 59 // 表示するユーザーアイコンを指定。nilを指定すると画像がでない 60 override func collectionView(_ collectionView: JSQMessagesCollectionView!, avatarImageDataForItemAt indexPath: IndexPath!) -> JSQMessageAvatarImageDataSource! { 61 if messages[indexPath.item].senderId != self.senderId { 62 return incomingAvatar 63 } 64 return nil 65 } 66 67 // メッセージの件数を指定 68 override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 69 return messages.count 70 } 71 72 // テストでメッセージを送信するためのメソッド 73 private func sendAutoMessage() { 74 let message = JSQMessage(senderId: targetUser["senderId"].string, displayName: targetUser["displayName"].string, text: "これはテストです") 75 messages.append(message!) 76 finishReceivingMessage(animated: true) 77 } 78 79 override func didReceiveMemoryWarning() { 80 super.didReceiveMemoryWarning() 81 // Dispose of any resources that can be recreated. 82 } 83 84 85 86 // 画像を送る 87 override func didPressAccessoryButton(_ sender: UIButton!) { 88 selectImage() 89 } 90 91 private func selectImage() { 92 let alertController = UIAlertController(title: "画像を選択", message: nil, preferredStyle: .actionSheet) 93 let cameraAction = UIAlertAction(title: "カメラを起動", style: .default) { (UIAlertAction) -> Void in 94 self.selectFromCamera() 95 } 96 let libraryAction = UIAlertAction(title: "カメラロールから選択", style: .default) { (UIAlertAction) -> Void in 97 self.selectFromLibrary() 98 } 99 let cancelAction = UIAlertAction(title: "キャンセル", style: .cancel) { (UIAlertAction) -> Void in 100 self.dismiss(animated: true, completion: nil) 101 } 102 alertController.addAction(cameraAction) 103 alertController.addAction(libraryAction) 104 alertController.addAction(cancelAction) 105 } 106 107 private func selectFromCamera() { 108 if UIImagePickerController.isSourceTypeAvailable(.camera) { 109 let imagePickerController = UIImagePickerController() 110 imagePickerController.delegate = (self as UIImagePickerControllerDelegate & UINavigationControllerDelegate) 111 imagePickerController.sourceType = UIImagePickerController.SourceType.camera 112 imagePickerController.allowsEditing = true 113 self.present(imagePickerController, animated: true, completion: nil) 114 } else { 115 print("カメラの使用を許可してください") 116 } 117 } 118 119 private func selectFromLibrary() { 120 if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) { 121 let imagePickerController = UIImagePickerController() 122 imagePickerController.delegate = (self as UIImagePickerControllerDelegate & UINavigationControllerDelegate) 123 imagePickerController.sourceType = UIImagePickerController.SourceType.photoLibrary 124 imagePickerController.allowsEditing = true 125 self.present(imagePickerController, animated: true, completion: nil) 126 } else { 127 print("カメラロールの使用を許可してください") 128 } 129 } 130 131 private func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : AnyObject]) { 132 if let image = info[UIImagePickerController.InfoKey.editedImage] { 133 sendImageMessage(image: image as! UIImage) 134 } 135 picker.dismiss(animated: true, completion: nil) 136 } 137 138 private func sendImageMessage(image: UIImage) { 139 let photoItem = JSQPhotoMediaItem(image: image) 140 let imageMessage = JSQMessage(senderId: senderId, displayName: senderDisplayName, media: photoItem)! 141 messages.append(imageMessage) 142 finishSendingMessage(animated: true) 143 } 144 145 146 147 148 149} 150 151

追記
private func selectImage()の部分を以下のように書き換えたところUIAleartControllerが立ち上がり、選択可能になりました。

Swift

1コード 2private func selectImage() { 3 let controller: UIAlertController = UIAlertController(title: "", message: "どの方法で写真を読み込みますか?", preferredStyle: UIAlertController.Style.actionSheet) 4 5 //1つ目の選択肢 6 controller.addAction(UIAlertAction(title: "写真を撮影する", style: UIAlertAction.Style.default, handler: {(action)in self.selectFromCamera()})) 7 8 //2つ目の選択肢 9 controller.addAction(UIAlertAction(title: "カメラロールから読み込む", style: UIAlertAction.Style.default, handler: { (action)in self.selectFromLibrary()})) 10 11 12 //キャンセルボタン 13 controller.addAction(UIAlertAction(title: "キャンセル", style: UIAlertAction.Style.cancel, handler: nil)) 14 15 //UIAleartControllerを表示 16 self.present(controller, animated: true, completion: nil ) 17 }

しかし、選択できても送信できずにいます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。たぶんですが

private func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : AnyObject]) {

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any])

にしないと、呼ばれないと思います。

投稿2019/05/28 07:03

takabosoft

総合スコア8356

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

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

yotubarail

2019/05/28 07:19

ありがとうございます。 少し内容は変わってしまうのですが、ここで使っているJSQMessagesViewControllerが開発が終了しているとのことで、MessageKitなどに変えたほうが今後を考えると良いのでしょうか。
takabosoft

2019/05/28 07:47

それに答えるだけの判断材料を私は持ち合わせていません。
yotubarail

2019/05/28 07:51

ご回答くださってありがとうございます。お手数をおかけして申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問