我如何将一个图像与另一个 ViewController 连接起来并在 ImageView 中显示它?
How do I segue an image to another ViewController and display it within an ImageView?
以下代码允许用户 select 图库中的图像或拍摄照片并通过 ImageView 在 ViewController 中显示。我想在这里做的是传递从图库中拍摄或 select 编辑的图像,并将其传递到另一个 ViewController 并显示在 ImageView 中。理想情况下,一旦图片被 select 编辑或拍摄,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()
}
}
在 class 之上定义一个变量,例如:
var selectedImage: UIImage
然后当您在该视图控制器中设置该图像并在另一个视图控制器中时,您只需显示您在第一个控制器中设置的图像。
编辑 2
鉴于您的代码中有太多错误,我将更具体一些。
首先:你需要了解UIImage和UIImageView的区别
其次:如果你想在用户 select 一张图片后执行 segue,你应该在 didFinishPickingMediaWithInfo
委托上调用该方法,如下所示:
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",不过你以后可以改)。
private var image: UIImage? // THIS ONE
@IBOutlet weak var btnClickMe: UIButton!
@IBOutlet weak var imageView: UIImageView!
第三:在ViewController2你需要将图片库设置为UIImageView。
override func viewDidLoad() {
super.viewDidLoad()
imageView.image = selectedImage
}
最后:在情节提要中,select ViewController,转到编辑器 -> 嵌入 -> 导航控制器。
现在,应该可以正常工作了。
一旦你 select 图片,调用下面的方法:
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 上设置 public 属性(正如 Unis Barakat 所说)。
然后在 NextViewController viewDidLoad() 上,您可以将图像设置为 imageView。
希望对您有所帮助!
以下代码允许用户 select 图库中的图像或拍摄照片并通过 ImageView 在 ViewController 中显示。我想在这里做的是传递从图库中拍摄或 select 编辑的图像,并将其传递到另一个 ViewController 并显示在 ImageView 中。理想情况下,一旦图片被 select 编辑或拍摄,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()
}
}
在 class 之上定义一个变量,例如:
var selectedImage: UIImage
然后当您在该视图控制器中设置该图像并在另一个视图控制器中时,您只需显示您在第一个控制器中设置的图像。
编辑 2
鉴于您的代码中有太多错误,我将更具体一些。
首先:你需要了解UIImage和UIImageView的区别
其次:如果你想在用户 select 一张图片后执行 segue,你应该在 didFinishPickingMediaWithInfo
委托上调用该方法,如下所示:
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",不过你以后可以改)。
private var image: UIImage? // THIS ONE
@IBOutlet weak var btnClickMe: UIButton!
@IBOutlet weak var imageView: UIImageView!
第三:在ViewController2你需要将图片库设置为UIImageView。
override func viewDidLoad() {
super.viewDidLoad()
imageView.image = selectedImage
}
最后:在情节提要中,select ViewController,转到编辑器 -> 嵌入 -> 导航控制器。
现在,应该可以正常工作了。
一旦你 select 图片,调用下面的方法:
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 上设置 public 属性(正如 Unis Barakat 所说)。 然后在 NextViewController viewDidLoad() 上,您可以将图像设置为 imageView。
希望对您有所帮助!