xcode - 如何像全局一样从一个 View Controller 获取图像到下一个 View Controller

标签 xcode swift

我的 CameraController 上只有一个摄像头。我希望将 CameraContoller 中的图片转到 ComposeViewControllerimage View 内的 ComposeViewController。所以基本上我需要它,以便拍摄的照片在拍摄后传输到另一个 View Controller 。下面的代码中有 2 个独立的 View Controller 。

代码:

  import UIKit
  import AVFoundation

   class CameraController : UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate{

var captureSession : AVCaptureSession?
var stillImageOutput : AVCaptureStillImageOutput?
var previewLayer : AVCaptureVideoPreviewLayer?
@IBOutlet var cameraView: UIView!

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    previewLayer?.frame = cameraView.bounds
}

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    captureSession = AVCaptureSession()
    captureSession?.sessionPreset = AVCaptureSessionPreset1920x1080

    var backCamera = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)

    var error : NSError?
    var input = AVCaptureDeviceInput(device: backCamera, error: &error)

    if (error == nil && captureSession?.canAddInput(input) != nil){

        captureSession?.addInput(input)

        stillImageOutput = AVCaptureStillImageOutput()
        stillImageOutput?.outputSettings = [AVVideoCodecKey : AVVideoCodecJPEG]

        if (captureSession?.canAddOutput(stillImageOutput) != nil){
            captureSession?.addOutput(stillImageOutput)

            previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
            previewLayer?.videoGravity = AVLayerVideoGravityResizeAspect
            previewLayer?.connection.videoOrientation = AVCaptureVideoOrientation.Portrait
            cameraView.layer.addSublayer(previewLayer)
            captureSession?.startRunning()

        }

    }

}
@IBOutlet var tempImageView: UIImageView!

   func didPressTakePhoto(){

    if let videoConnection = stillImageOutput?.connectionWithMediaType(AVMediaTypeVideo){
        videoConnection.videoOrientation = AVCaptureVideoOrientation.Portrait
        stillImageOutput?.captureStillImageAsynchronouslyFromConnection(videoConnection, completionHandler: {
            (sampleBuffer, error) in

            if sampleBuffer != nil {

                var imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer)
                var dataProvider  = CGDataProviderCreateWithCFData(imageData)
                var cgImageRef = CGImageCreateWithJPEGDataProvider(dataProvider, nil, true, kCGRenderingIntentDefault)

                var image = UIImage(CGImage: cgImageRef, scale: 1.0, orientation: UIImageOrientation.Right)

                self.tempImageView.image = image
                self.tempImageView.hidden = false

            }                            
        })
    }             
}

var didTakePhoto = Bool()

func didPressTakeAnother(){
    if didTakePhoto == true{
        tempImageView.hidden = true
        didTakePhoto = false            
    }
    else{
        captureSession?.startRunning()
        didTakePhoto = true
        didPressTakePhoto()            
    }

}

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    didPressTakeAnother()
}

  }

   //-----Below is my Next View Controller where i want the image from      the above view controller to show up---------------------------------------      ---------------------------------------------------------------------------  --------------

       class ComposeViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UITextViewDelegate {

@IBOutlet weak var captionTextView: UITextView!
@IBOutlet weak var previewImage: UIImageView!

let tap = UITapGestureRecognizer()

override func viewDidLoad() {
    super.viewDidLoad()


    var swipe: UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: "GotoProfile")
    swipe.direction = UISwipeGestureRecognizerDirection.Right
    self.view.addGestureRecognizer(swipe)

    tap.numberOfTapsRequired = 2
    tap.addTarget(self, action: "GoBack")
    view.userInteractionEnabled = true
    view.addGestureRecognizer(tap)

    captionTextView.delegate = self 

    // Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.

}
func CaptonField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    if range.length + range.location > count(captionTextView.text){

        return false

    }

    let NewLength = count(captionTextView.text) + count(string) - range.length
    return NewLength <= 35
}


@IBAction func chooseImageFromCamera() {
    let picker = UIImagePickerController()

    picker.delegate = self
    picker.sourceType = .Camera

    presentViewController(picker,animated: true, completion:nil)

}    

func GotoProfile(){
    self.performSegueWithIdentifier("NewCameraViewFromComposeSegue", sender: nil)

}
func GoBack(){
    self.performSegueWithIdentifier("GoBackFromCamerasegue", sender: nil)

}


@IBAction func addImageTapped(sender: AnyObject) {
    let imagePicker = UIImagePickerController()

    imagePicker.delegate = self
    imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
    imagePicker.mediaTypes = UIImagePickerController.availableMediaTypesForSourceType(.PhotoLibrary)!
    imagePicker.allowsEditing = false

    self.presentViewController(imagePicker, animated: true, completion: nil)

}
    func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {

        self.previewImage.image = image

        self.dismissViewControllerAnimated(true, completion: nil)

    }
func textViewShouldEndEditing(textView: UITextView) -> Bool {
    captionTextView.resignFirstResponder()
    return true;
}

@IBAction func composeTapped(sender: AnyObject) {

    let date = NSDate()
    let dateFormatter = NSDateFormatter()
    dateFormatter.timeStyle = NSDateFormatterStyle.ShortStyle
    dateFormatter.dateStyle = NSDateFormatterStyle.ShortStyle
    let localDate = dateFormatter.stringFromDate(date)

    let imageToBeUploaded = self.previewImage.image
    let imageData = UIImagePNGRepresentation(imageToBeUploaded)


    let file: PFFile = PFFile(data: imageData)
    let fileCaption: String = self.captionTextView.text

    var photoToUpload = PFObject(className: "Posts")
    photoToUpload["Image"] = file
    photoToUpload["Caption"] = fileCaption
    photoToUpload["addedBy"] = PFUser.currentUser()?.username
    photoToUpload["date"] = localDate

    photoToUpload.save()

    println("Successfully Posted.")

    let vc: AnyObject? = self.storyboard?.instantiateViewControllerWithIdentifier("NavigationController")
    self.presentViewController(vc as! UIViewController, animated: true, completion: nil)       

 }
 }

最佳答案

您是否使用 Segue 从第一个 ViewController 转到第二个 ViewController ?

如果是这样,您可以在prepareForSegue函数中访问第一个VC中的第二个VC:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "ComposeVCIdentifier" {            
        let composeViewController = segue.destinationViewController as! ComposeViewController
        composeViewController.someVariable = myPicture
    }
}

关于xcode - 如何像全局一样从一个 View Controller 获取图像到下一个 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32362853/

相关文章:

swift - SceneKit 问题将纹理应用于自定义几何体

iOS 蓝牙 UUID 在 8.2 上启动一些应用程序后发生变化

iphone - 在sqlite3_step行上崩溃?

ios - Xcode 6 中缺少基本 SDK

ios - 如何使用 alamofire 传递包含模型对象数组的复杂字典?

ios - Switch在检查table view tag时,会陆续调用多个case

swift - 在 Xcode Swift 中的不同导航 Controller 之间移动

ios - Visual Studio Cordova 错误 'No matching provisioning profiles found: No provisioning profiles matching the bundle identifier were found.'

ios - 无法将类型 'UIView' (0x112484eb0) 的值转换为 'SKView' (0x111646718)

ios - 确定用户是否允许 iOS 7 中的本地通知