将图像传递给另一个视图控制器(Swift)

时间:2015-07-23 00:28:58

标签: ios swift uiviewcontroller uiimageview uibutton

我试图将用户上传的图像从一个 UIImageView 移动到另一个View Controller上的另一个 UIImageView 。我可以让用户上传图片并将其保存在第一个 UIImageView 中,但在他们按下" Post"按钮,下一个视图控制器上的UIImageView保持空白。

注意:browsingImage是第二个视图控制器(目标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

    }

}

4 个答案:

答案 0 :(得分:24)

prepare(for:)中,您无法访问目标视图控制器的@IBOutlet,因为它们尚未设置。您应该将图像分配给目标视图控制器的属性,然后将其移动到viewDidLoad()中的位置:

在源视图控制器中:

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

在目标视图控制器中:

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

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

答案 1 :(得分:1)

根据您的描述,browsingImage位于目标viewController中,所以 在这一行

itemToAdd.postingImage.image = browsingImage.image

您将目标imageview传递给源imageview

答案 2 :(得分:1)

您当前的视图控制器中无法访问IBOutlet。由于您的第二个视图尚未加载,因此这些商店尚未初始化。

相反,您可以在第二个viewController中创建一个UIImage变量,并在prepareForSegue中为其赋值。

在你的第二个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

答案 3 :(得分:0)

在发生Segue时,您的UIImageView未初始化,因此您无法为其分配图像,最佳做法是通过UIImage并初始化您的UIImageViewviewDidLoad

因此,在您的ListPage班级中,将UIImage类型的属性更改为prepareForSegue

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

    if segue.identifier == "toBrowsePage" {


        var itemToAdd = segue.destinationViewController as! ListPage

        itemToAdd.image = browsingImage.image

        }

    }

在目的地的viewDidLoadviewDidAppear viewController,你会做同样的事情

browsingImage.image = image