前提・実現したいこと
ここに質問の内容を詳しく書いてください。
カメラで撮った写真をボタンの画像に反映したいのですが、何故か反映しないので
教えてくれると助かります。
該当のソースコード
Swift
1@IBOutlet weak var hospitalText: UITextField! 2 3 @IBOutlet weak var examinationText: UITextField! 4 5 @IBOutlet weak var cameraImage: UIButton! 6 7 8 @IBOutlet weak var LoadIndicator: UIActivityIndicatorView! 9 10 11 var photoImage : UIImage! 12 13 var imageFile :String! 14 15 var downloadUrl: String! 16 17 private let db = Firestore.firestore() 18 19 private let userID = Auth.auth().currentUser?.uid 20 21 22 23 24 override func viewDidLoad() { 25 super.viewDidLoad() 26 LoadIndicator.center = view.center 27 LoadIndicator.style = .large 28 LoadIndicator.color = .blue 29 view.addSubview(LoadIndicator) 30 examinationText.delegate = self 31 hospitalText.delegate = self 32 } 33 34 func textFieldShouldReturn(_ textField:UITextField ) -> Bool{ 35 36 hospitalText.resignFirstResponder() 37 examinationText.resignFirstResponder() 38 return true 39 } 40 41 42 43 func getTime() -> String{ 44 //時間を取得する 45 let dt = Date() 46 let dateFormatter = DateFormatter() 47 //日付の書式&日本時間にする 48 dateFormatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "yMMMdHm", options: 0, locale: Locale(identifier: "ja_JP")) 49 let date = dateFormatter.string(from:dt) 50 51 return date 52 } 53 54 55 56 57 58 func uploadImage() -> String { 59 60 61 let storage = Storage.storage().reference(forURL: String(describing: "Medicine")) 62 63 let imageRef = storage.child("MedicineImage").child("(userID)") 64 65 let imageData:Data = photoImage.pngData()! 66 67 imageRef.putData(imageData,metadata: nil){ (metaData,error) in 68 69 if error != nil{ 70 print(error.debugDescription) 71 return 72 } 73 } 74 imageRef.downloadURL(){ url,err in 75 76 if let url = url { 77 self.downloadUrl = url.absoluteString 78 }else{ 79 print(err as Any) 80 } 81 } 82 return downloadUrl 83 } 84 85 86 87 88 89 90 91 private func Add() { 92 93 imageFile = uploadImage() 94 95 db.collection("users").document("(userID!)").collection("medicinedata").document((getTime())).setData([ 96 "hospitalData": hospitalText.text! , 97 "examinationData": examinationText.text!, 98 "time": getTime(), 99 "photoData": imageFile! 100 ]) 101 } 102 103 104 105 @IBAction func startUiImagePickerController(_ sender: Any) { 106 //カメラを起動する 107 if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.camera){ 108 let picker = UIImagePickerController() 109 picker.sourceType = .camera 110 picker.modalPresentationStyle = UIModalPresentationStyle.fullScreen 111 picker.delegate = self 112 present(picker, animated: true, completion: nil) 113 114 } 115 } 116 117 118 private func imagePickController(_ imagePick: UIImagePickerController,didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 119 120 if let photo = info[.originalImage] as? UIImage{ 121 122 photoImage = UIImage(named:"(photo)") 123 124 cameraImage.setImage(photoImage, for: .normal) 125 imagePick.dismiss(animated: true, completion: nil) 126 127 }else{ 128 129 let dialog = UIAlertController(title: "画像を取得出来ませんでした", message: nil, preferredStyle: .alert) 130 let dialogAction = UIAlertAction(title: "OK", style: .default, handler: nil) 131 dialog.addAction(dialogAction) 132 present(dialog, animated: true, completion: nil) 133 134 } 135 }
photoImage = UIImage(named:"\(photo)") は何をしたいのでしょうか?
カメラで撮った写真をcameraImageのsetImageにセットするための変数です。
書き方が悪かったですね。
if let photo = info[.originalImage] as? UIImage{
の時点で photo というローカル変数にはカメラで撮った写真が格納されてるはずです。
それを photoImage プロパティに格納したいなら photoImage = photo だけでいいはず。
photoImage = UIImage(named:"\(photo)") だと、まず photo を文字列にして ("<UIImage:0x〜>" みたいな謎の文字列になる) その名前の画像リソースを Assets.xcassets の中から探します。が、まず見つからないと思うので、nil になり、何も表示されないと思います。
ということは、そのまま photoImage = photoという感じで入れれば良いということですか?
カメラで撮った写真をphotoImage = photoという感じで入れてcameraImage.setImage(photoImage, for: .normal)という形で入れれば表示されるということですか?
あなたの回答
tips
プレビュー