У меня есть два контроллера Вид:Делегат перестал работать
CameraViewController
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()
}
меня провести последний час, пытаясь понять, что мне не хватает, но не могу видеть его. Надеюсь, кто-то здесь это увидит.
Обе делегаты являются слабыми, может быть, в какой-то момент один из контроллера представления увольняемым, но так как делегат слаб, поэтому диспетчер просмотра удален из памяти, а делегат становится нулевым? Это имеет смысл? – Piotr