ユーザーがアップロードした画像を、別のビューコントローラーのある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
}
}
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
}
}
_
現在の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
あなたの説明から、browsingImage
は宛先viewControllerにあるので、この行では
itemToAdd.postingImage.image = browsingImage.image
宛先の画像表示をソースの画像表示に渡します
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