web-dev-qa-db-ja.com

別のビューコントローラーに画像を渡す(Swift)

ユーザーがアップロードした画像を、別のビューコントローラーのあるIImageViewから別のIImageViewに移動しようとしています。ユーザーに画像をアップロードして最初のIImageViewに保存させることはできますが、「投稿」ボタンを押した後、次のビューコントローラーのUIImageViewは空白のままです。

注:browsingImageは、2番目のビューコントローラー(宛先UIImageView)上のUIImageViewの名前です。

どんな助けでも大歓迎です!

@IBAction func cameraButton(sender: AnyObject) {

    addNewPicture()

}


func addNewPicture() {

    let picker = UIImagePickerController()
    picker.allowsEditing = true
    picker.delegate = self

    presentViewController(picker, animated: true, completion: nil)
}

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {

    postingImage.image = image
    self.dismissViewControllerAnimated(true, completion: nil)

}

@IBAction func postButton(sender: AnyObject) {

    performSegueWithIdentifier("toBrowsePage", sender: nil)


}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if segue.identifier == "toBrowsePage" {


        var itemToAdd = segue.destinationViewController as! ListPage

        itemToAdd.postingImage.image = browsingImage.image

    }

}
12
user5034511

prepare(for:)では、宛先のビューコントローラーの_@IBOutlet_ sがまだ設定されていないため、それらにアクセスできません。画像を目的のView Controllerのプロパティに割り当ててから、viewDidLoad()の所定の場所に移動する必要があります。

ソースビューコントローラー:

_override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "toBrowsePage" {
        let dvc = segue.destination as! ListPage
        dvc.newImage = postingImage.image
    }
}
_

デスティネーションView Controllerで:

_class ListPage: UIViewController {
    @IBOutlet weak var browsingImage: UIImageView!
    var newImage: UIImage!

    override func viewDidLoad() {
        super.viewDidLoad()
        browsingImage.image = newImage
    }
}
_
24
vacawama

現在のView ControllerではIBOutletsにアクセスできません。 2番目のビューがまだロードされていないであるため、アウトレットはまだ初期化されていません。

代わりに、2番目のviewControllerでUIImage変数を作成し、prepareForSegueでそれに値を割り当てることができます。

そして、2番目のviewControllerのviewDidLoadメソッドで、その値をImageViewアウトレットに割り当てます。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if segue.identifier == "toBrowsePage" {
        let destination = segue.destinationViewController as! ListPage
        destination.receivedImage = postingImage.image
    }
}

次のviewControllerで、次の変数を宣言します

@IBOutlet weak var postingImage: UIImageView!
var receivedImage : UIImage?

ViewDidLoadメソッド

postingImage.image = receivedImage
1
iPhoneDeveloper

あなたの説明から、browsingImageは宛先viewControllerにあるので、この行では

itemToAdd.postingImage.image = browsingImage.image

宛先の画像表示をソースの画像表示に渡します

1
Leo

Segueが発生した時点では、UIImageViewは初期化されていないため、画像を割り当てることができません。UIImageを渡してUIImageViewを初期化することをお勧めしますviewDidLoadにあります。

したがって、ListPageクラスでUIImageタイプのプロパティを作成し、prepareForSegue行を次のように変更します。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if segue.identifier == "toBrowsePage" {


        var itemToAdd = segue.destinationViewController as! ListPage

        itemToAdd.image = browsingImage.image

        }

    }

目的地のviewDidLoadまたはviewDidAppearでは、次のようになりますviewController

browsingImage.image = image
0
Qazi