Swift 如何将图像分割到另一个ViewController并在ImageView中显示?

Swift 如何将图像分割到另一个ViewController并在ImageView中显示?,swift,image,imageview,segue,viewcontroller,Swift,Image,Imageview,Segue,Viewcontroller,以下代码允许用户从gallery中选择图像,或通过ImageView在ViewController中拍照并显示。我想在这里做的是将从gallery中拍摄或选择的图像传递给另一个ViewController,并将其显示在ImageView中。理想情况下,选择或拍摄图片后,ViewController会立即更改为第二个ViewController,并在ImageView中显示图像 如何做到这一点?谢谢 import Foundation import UIKit import MobileCoreS

以下代码允许用户从gallery中选择图像,或通过ImageView在ViewController中拍照并显示。我想在这里做的是将从gallery中拍摄或选择的图像传递给另一个ViewController,并将其显示在ImageView中。理想情况下,选择或拍摄图片后,ViewController会立即更改为第二个ViewController,并在ImageView中显示图像

如何做到这一点?谢谢

import Foundation
import UIKit
import MobileCoreServices
import AssetsLibrary
import AVFoundation
import SystemConfiguration

class ViewController: UIViewController, UITextViewDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate, UITextFieldDelegate, UIPopoverControllerDelegate, UIAlertViewDelegate {

    var controller = UIImagePickerController()
    var assetsLibrary = ALAssetsLibrary()
    var selectedImage = UIImageView ()

    private var image: UIImage? // THIS ONE

    @IBOutlet weak var btnClickMe: UIButton!
    @IBOutlet weak var imageView: UIImageView!

    var picker:UIImagePickerController?=UIImagePickerController()
    var popover:UIPopoverController?=nil

    override func viewDidLoad() {
        super.viewDidLoad()
        picker!.delegate=self

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

    }

    @IBAction func btnImagePickerClicked(sender: AnyObject)
    {
        let alert:UIAlertController=UIAlertController(title: "Choose Image", message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet)

        let cameraAction = UIAlertAction(title: "Camera", style: UIAlertActionStyle.Default)
            {
                UIAlertAction in
                self.openCamera()

        }
        let gallaryAction = UIAlertAction(title: "Gallery", style: UIAlertActionStyle.Default)
            {
                UIAlertAction in
                self.openGallary()
        }
        let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel)
            {
                UIAlertAction in

        }

        // Add the actions
        picker?.delegate = self
        alert.addAction(cameraAction)
        alert.addAction(gallaryAction)
        alert.addAction(cancelAction)
        // Present the controller
        if UIDevice.currentDevice().userInterfaceIdiom == .Phone
        {
            self.presentViewController(alert, animated: true, completion: nil)
        }
        else
        {
            popover=UIPopoverController(contentViewController: alert)
            popover!.presentPopoverFromRect(btnClickMe.frame, inView: self.view, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true)
        }
    }
    func openCamera()
    {
        if(UIImagePickerController .isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera))
        {
            picker!.sourceType = UIImagePickerControllerSourceType.Camera
            self .presentViewController(picker!, animated: true, completion: nil)
        }
        else
        {
            openGallary()
        }
    }
    func openGallary()
    {
        picker!.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
        if UIDevice.currentDevice().userInterfaceIdiom == .Phone
        {
            self.presentViewController(picker!, animated: true, completion: nil)
        }
        else
        {
            popover=UIPopoverController(contentViewController: picker!)
            popover!.presentPopoverFromRect(btnClickMe.frame, inView: self.view, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true)
        }
    }
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject])
    {
        picker .dismissViewControllerAnimated(true, completion: nil)
        imageView.image=info[UIImagePickerControllerOriginalImage] as? UIImage
        image = imageView.image!
        performSegueWithIdentifier("TEST", sender: self)
    }
    func imagePickerControllerDidCancel(picker: UIImagePickerController)
    {
        print("picker cancel.")

    }
}
这是我的第二个ViewController

 import UIKit

class ViewController2: UIViewController {

        var Image = UIImage ()

        @IBOutlet var imageView: UIImageView!

        override func viewDidLoad() {
            super.viewDidLoad()
            imageView.image = Image
        }

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

在类的顶部定义一个变量,类似于:

var selectedImage: UIImage

然后,当您在该视图控制器中设置该图像,在另一个视图控制器中,您只需显示在第一个控制器中设置的图像。

在类的顶部定义一个变量,类似于:

var selectedImage: UIImage
然后,当您在该视图控制器中设置该图像,在另一个视图控制器中,只需显示您在第一个控制器中设置的图像。

Edit 2 考虑到你的代码中有太多的错误,我将更具体一点

首先:您需要了解UIImage和UIImageView之间的区别

第二:如果要在用户选择图像后执行segue,则应调用
didfishpickingmediaWithInfo
委托上的方法,如下所示:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject])
{
    picker .dismissViewControllerAnimated(true, completion: nil)
    imageView.image=info[UIImagePickerControllerOriginalImage] as? UIImage
    image = imageView.image!
    performSegueWithIdentifier("mySegueToNextViewController", sender: self)
}
此外,我还添加了一个名为“image”的新属性(应该称为“selectedImage”,但您可以稍后对其进行更改)

第三:在ViewController2上,需要将图像库设置为UIImageView

override func viewDidLoad() {
    super.viewDidLoad()
    imageView.image = selectedImage
}
最后:在故事板中,选择ViewController,进入编辑器->嵌入->导航控制器

现在,应该可以了


选择图像后,请调用以下方法:

performSegueWithIdentifier("mySegueToNextViewController", sender: self)
然后,您需要实现:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "mySegueToNextViewController" {
        if let nextViewController = segue.destinationViewController as? NextViewController {

            nextViewController.image = selectedImage   
        }
    }

}
请记住,要使其发挥作用,您应该在NextViewController上拥有公共财产(就像Unis Barakat所说的)。 然后在NextViewController viewDidLoad()上,可以将图像设置为imageView

希望这有帮助

编辑2 考虑到你的代码中有太多的错误,我将更具体一点

首先:您需要了解UIImage和UIImageView之间的区别

第二:如果要在用户选择图像后执行segue,则应调用
didfishpickingmediaWithInfo
委托上的方法,如下所示:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject])
{
    picker .dismissViewControllerAnimated(true, completion: nil)
    imageView.image=info[UIImagePickerControllerOriginalImage] as? UIImage
    image = imageView.image!
    performSegueWithIdentifier("mySegueToNextViewController", sender: self)
}
此外,我还添加了一个名为“image”的新属性(应该称为“selectedImage”,但您可以稍后对其进行更改)

第三:在ViewController2上,需要将图像库设置为UIImageView

override func viewDidLoad() {
    super.viewDidLoad()
    imageView.image = selectedImage
}
最后:在故事板中,选择ViewController,进入编辑器->嵌入->导航控制器

现在,应该可以了


选择图像后,请调用以下方法:

performSegueWithIdentifier("mySegueToNextViewController", sender: self)
然后,您需要实现:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "mySegueToNextViewController" {
        if let nextViewController = segue.destinationViewController as? NextViewController {

            nextViewController.image = selectedImage   
        }
    }

}
请记住,要使其发挥作用,您应该在NextViewController上拥有公共财产(就像Unis Barakat所说的)。 然后在NextViewController viewDidLoad()上,可以将图像设置为imageView


希望这有帮助

全局变量是糟糕的设计选择,如果要使用全局变量,至少应该使用单例。全局变量是糟糕的设计选择,如果要使用全局变量,至少应该使用单例。我已经更新了问题和代码。我实现了您建议的代码,但仍然无法使其正常工作。选择图像或拍摄图像时,ViewController不会更改为第二个,图像也不会显示在ImageView中的第二个视图控制器中。我已经正确设置了标识符,但仍然没有成功。您的错误是您正在创建UIImage的IBOutlet,而不是UIImageView<代码>@IBOutlet var image:UIImage何时应该是
@IBOutlet var imageView:UIImageView。另外,在
覆盖func viewDidLoad()
中,需要如下设置UIImageView的image属性
imageView.image=selectedImage
@dave我已经完成了这项工作,但是仍然没有运气,segue没有初始化,因此它没有切换视图。我已经正确设置了所有内容,并更新了上面的代码。我将向您发送一个下载链接。这是测试版本的下载链接,它显示了当用户选择图像时,您希望它如何正常工作,并移动到下一个视图控制器?我已更新了问题和代码。我实现了您建议的代码,但仍然无法使其正常工作。选择图像或拍摄图像时,ViewController不会更改为第二个,图像也不会显示在ImageView中的第二个视图控制器中。我已经正确设置了标识符,但仍然没有成功。您的错误是您正在创建UIImage的IBOutlet,而不是UIImageView<代码>@IBOutlet var image:UIImage何时应该是
@IBOutlet var imageView:UIImageView。另外,在
覆盖func viewDidLoad()
中,需要如下设置UIImageView的image属性
imageView.image=selectedImage
@dave我已经完成了这项工作,但是仍然没有运气,segue没有初始化,因此它没有切换视图。我已经正确设置了所有内容,并更新了上面的代码。我将向您发送一个下载链接。这是测试版本的下载链接,它显示了它如何无法正常工作。您希望在用户选择图像后立即移动到下一个视图控制器?