2016-01-26 1 views
0

Следующий код позволяет пользователю выбрать изображение из галереи или сделать снимок и отобразить его в ViewController через ImageView. Я хочу сделать это, чтобы передать изображение, которое было отобрано или выбрано в галерее, и передать его другому ViewController, которому он будет отображаться в ImageView. Идеально после того, как изображение будет выбрано или отображено, ViewController немедленно переключится на второй ViewController и отобразит изображение в ImageView.Как перенести изображение в другой 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() 
     } 
    } 

ответ

2

Edit 2

Учитывая, что у вас слишком много ошибок в коде, я собираюсь немного более конкретными.

Первое: Вы должны понимать разницу между UIImage и UIImageView

Второе: Если вы хотите выполнить 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) 
} 

Кроме того, я добавил новое свойство под названием «изображение» (должно называться «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 
} 

Наконец: В раскадровке, выберите 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 (как сказал Унис Баракат). Затем в окне просмотра NextViewControllerDidLoad() вы можете установить изображение в imageView.

Надеюсь, это поможет!

+0

Я обновил вопрос и код.Я внедрил предложенный вами код и все еще не могу заставить его работать. Когда я выбираю изображение или беру изображение, ViewController не переходит ко второму, и изображение не появляется на втором контроллере представления в ImageView. Я правильно установил идентификатор, но все равно не повезло. –

+0

Ваша ошибка в том, что вы создаете IBOutlet UIImage вместо UIImageView. '@IBOutlet var image: UIImage!', Когда это должно быть '@IBOutlet var imageView: UIImageView!'. Также в 'override func viewDidLoad()' вам нужно установить свойство изображения UIImageView следующим образом. 'imageView.image = selectedImage'. – dava

+0

@dave Я сделал это, но все же не повезло, segue не инициализирует поэтому, почему он не переключает представления. Я правильно настроил все и обновил код выше. Я пришлю вам ссылку для скачивания. –

0

на вершине класса определяют переменную, что-то вроде:

var selectedImage: UIImage 

тогда, когда вы находитесь в этом контроллере представления набора, что изображение и другой контроллер просмотра, вы просто отобразите изображение, которое вы установили в первом контроллере.

+0

глобальные переменные являются плохими вариантами дизайна, если вы собираетесь использовать глобальный, вы должны хотя бы сделать это, используя одноэлемент. –