2015-07-31 4 views
1

У меня есть два контроллера Вид:Делегат перестал работать

  1. CameraViewController
  2. CameraPhotoDetailViewController

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

Я создал протокол под названием CameraDelegate в CameraViewController:

@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: -  
    ... 
} 

Поручаю те делегат override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){} в CameraViewController

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {   

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

почему делегаты работают, когда я звоню метод протокола didCloseCameraImageDetailView() из CameraPhotoDetailViewController, но не работает, когда я звоню метод протокола cameraImageReady(#image: UIImage) из CameraViewController.

Вызов из 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) 
       } 
      }) 
     } 
} 

Calling из CameraPhotoDetailViewController

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

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

+0

Обе делегаты являются слабыми, может быть, в какой-то момент один из контроллера представления увольняемым, но так как делегат слаб, поэтому диспетчер просмотра удален из памяти, а делегат становится нулевым? Это имеет смысл? – Piotr

ответ

0

Хорошо, я знаю, чувствую, как идиот - я был первым вызовом метода делегата, а затем я назначил делегата в prepareForSegue() ...