代表停止工作

Delegate stopped working

我有两个视图控制器:

  1. CameraViewController
  2. CameraPhotoDetailViewController

我在第一个中拍照,然后对第二个执行 segue 并将图像呈现给用户

我在 CameraViewController 中创建了名为 CameraDelegate 的协议:

@objc protocol CameraDelegate: class {
    optional func cameraImageReady(#image: UIImage)
    optional func didCloseCameraImageDetailView()
}

两个视图控制器都在实现这个协议并且都有委托

CameraViewController

class CameraViewController: UIViewController, AVCaptureFileOutputRecordingDelegate, CameraDelegate {

    // MARK:
    // MARK: - Property
    @IBOutlet weak var captureButton: UIButton!
    @IBOutlet var previewView: CameraPreviewView!

    weak var cameraDelegate: CameraDelegate?
    ...
 }

CameraPhotoDetailViewController

class CameraPhotoDetailViewController: UIViewController, UITextFieldDelegate, CameraDelegate {

    // MARK: Variables
    @IBOutlet weak var cameraDetailView: SpringView!
    @IBOutlet weak var cameraImageView: UIImageView!
    @IBOutlet weak var cameraImageNameLabel: UITextField!


    weak var cameraDelegate: CameraDelegate?
    // MARK: -    
    ...
}

我在CameraViewController

中分配给override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){}中的那些代表
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {        

        if let cameraPhotoDetailViewController = segue.destinationViewController as? CameraPhotoDetailViewController {
            println("Segue")
            self.cameraDelegate = cameraPhotoDetailViewController
            cameraPhotoDetailViewController.cameraDelegate = self
        }
    }

出于某种原因,当我从 CameraPhotoDetailViewController 调用协议方法 didCloseCameraImageDetailView() 时委托起作用,但当我从 CameraViewController 调用协议方法 cameraImageReady(#image: UIImage) 时委托不起作用。

来自 CameraViewController

@IBAction func didPressCaptureButton(sender: AnyObject) {

        captureButton.hidden = true

        let videoOrientation =  (self.previewView.layer as! AVCaptureVideoPreviewLayer).connection.videoOrientation

self.stillImageOutput!.connectionWithMediaType(AVMediaTypeVideo).videoOrientation = videoOrientation

        // Flash set to Auto for Still Capture
        CameraViewController.setFlashMode(AVCaptureFlashMode.Auto, device: self.videoDeviceInput!.device)



if let videoConnection = self.stillImageOutput!.connectionWithMediaType(AVMediaTypeVideo) {
            videoConnection.videoOrientation = AVCaptureVideoOrientation.Portrait

            self.stillImageOutput?.captureStillImageAsynchronouslyFromConnection(videoConnection, completionHandler: { (sampleBuffer, error) -> Void in
                if (sampleBuffer != nil) {

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

                    var image: UIImage = UIImage(data: imageData)!                 
                    self.cameraDelegate?.cameraImageReady!(image: image)       
                 self.performSegueWithIdentifier(Constants.CAMERA_IMAGE_DETAIL_SEGUE, sender: self)
                }
            })
        }
}

来自 CameraPhotoDetailViewController

@IBAction func didPressCloseButton(sender: AnyObject) {
    dismissViewControllerAnimated(false, completion: nil)
    cameraDelegate?.didCloseCameraImageDetailView!()
    //activityIndicator.removeFromSuperview()
}

我花了最后一个小时试图弄清楚我错过了什么,但无法真正看到它。希望这里有人看到。

好吧,我知道我觉得自己很白痴 - 我先是调用了委托方法,然后在 prepareForSegue()...

中分配了委托