2017-12-11 11 views
1

デリゲートパターンの詳細を調べようとしています。ユーザーのカメラロールにアクセスするアプリケーションを作成し、ユーザーが画像を選択した後で、その画像をビューコントローラーに表示したいとします。SwiftのUIIamgePickerControllerDelegateを使用して、選択した画像を画面に表示

import UIKit 

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 

    @IBOutlet weak var imagePickerView: UIImageView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    // Delegate Methods 
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
     if let image = info[UIImagePickerControllerOriginalImage] as? UIImage { 
      imagePickerView.image = image 
     } 
    } 

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 
     self.dismiss(animated: true, completion: nil) 
    } 

    @IBAction func pickAnImage(_ sender: Any) { 

     let pickerController = UIImagePickerController() 
     present(pickerController, animated: true, completion: nil) 
    } 
} 

カメラロールには、予想通り表示され、キャンセルボタンは、モーダルを却下:ここでは私がこれまで持っているものです。画像を選択するとモーダルは消えますが、画像は画面に表示されません。 imagePickerControllerがコンセントとして参照されていることを確認しました。私は何が欠けていますか?あなたはpickerController

// pickerController.delegateのデリゲートとしてビューコントローラを設定する必要が

+1

あなたは現在の – Retterdesdialogs

答えて

2

あなたは画像が選択されると、コントローラを却下する必要があり、おそらく以下の詳細な機能は、あなたを助ける:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 

    var selectedImageFromPicker: UIImage? 
    if let editedImage = info[UIImagePickerControllerEditedImage] as? UIImage { 
     selectedImageFromPicker = editedImage 
    } else if let originalImage = info[UIImagePickerControllerOriginalImage] as? UIImage { 
     selectedImageFromPicker = originalImage 
    } 

    if let selectedImage = selectedImageFromPicker { 
     imageView.image = selectedImage 
    } 
    dismiss(animated: true, completion: nil) 
} 
+0

そうです、コントローラーの解任は私が行方不明だったステップでした。それと、代議員の割り当て。初心者の間違い。 –

+0

いいえ、ここで質問する前にコーディングを続け、より多くの研究をしてください。 –

1

=自己

もimagePickerView出口が接続されている確認してください。

+0

男の前にpickerController.delegate = selfがありません。これは、私が作ったような初心者のことです。私はもう一つ質問があります。画像を選択すると、モーダルは解除されません。画像を選択してキャンセルを押すと、画像が画面に表示されます。その最後のステップをスキップするにはどうすればよいですか? –

+0

また、デリゲートへの参照を作成し、pickAnImageメソッド内でデリゲートを割り当てるのは良い考えですか?私はクラスの始めとメソッドの中で宣言されたものを見てきました。私はベストプラクティスを確信しています。 –

+0

選択した場合は、ピッカーも閉じます。委任参照はUIImagePickerControllerによって保持されます。私たちは心配する必要はありません。しかし、ボタンをクリックしたときにこれらの割り当てが必要ではないという考えは、代行者の割り当てがロード時に実行できるためです。ボタンをクリックすると、ピッカーのみが表示されます。 (この方法で、ピッカーのグローバル参照を維持する必要があります) – akhiljayaram

0
  • あなたはInfo.plistファイル内のすべての介在物
  • はあなたがすべてのデリゲートが、編集はその後、trueに設定されている場合、画像(例えばを表示するために使用していることを確認し
  • を設定していることを確認してきたことを確認しUIImagePickerControllerEditedImageUIImagePickerControllerOriginalImage
0
import UIKit 

class ViewController: UIViewController, UIImagePickerControllerDelegate, 

    UINavigationControllerDelegate { 


     @IBOutlet weak var imagePickerView: UIImageView! 


     override func viewDidLoad() { 
      super.viewDidLoad() 
     } 


     func btnPickImageAction(_ sender: UIButton) { 

      // To Get image from photoLibrary source type 
      if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) { 
       let imagePicker = UIImagePickerController() 
       imagePicker.delegate = self 
       imagePicker.sourceType = .photoLibrary; 
       imagePicker.allowsEditing = true 
       self.present(imagePicker, animated: true, completion: nil) 
      } 

      /* 
      // To capture image from camera Source Type 
      if UIImagePickerController.isSourceTypeAvailable(.camera) { 
       let imagePicker = UIImagePickerController() 
       imagePicker.delegate = self 
       imagePicker.sourceType = .camera; 
       imagePicker.allowsEditing = false 
       self.present(imagePicker, animated: true, completion: nil) 
      } 
      */ 
     } 

     func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
      let image = info[UIImagePickerControllerOriginalImage] as! UIImage 
      imagePickerView.image = image 
      dismiss(animated:true, completion: nil) 
     } 
     func imagePickerControllerDidCancel(_ picker: UIImagePickerController) 
     { 
      dismiss(animated:true, completion: nil) 
     } 
    } 
+0

プライバシーを追加することを忘れてはなりません - フォトライブラリの使用方法の説明とプライバシー - カメラの使用方法info.plistファイルの説明 –

関連する問題