代表停止工作
Delegate stopped working
我有两个视图控制器:
CameraViewController
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()
...
中分配了委托
我有两个视图控制器:
CameraViewController
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()
...