协议委托不工作有时
我有一个协议,委托不总是响应的问题。下面是我的实现:协议委托不工作有时
protocol CameraViewDelegate: class {
func didTapCancel(sender: CameraView)
func didFinishSelectingPhoto(image: UIImage, sender: CameraView)
}
在CameraView I类有:
weak var delegate: CameraViewDelegate?
和
@IBAction func cancelButtonTapped() {
delegate?.didTapCancel(self)
}
@IBAction func sendPhotoTapped() {
if let image = selectedImage {
delegate?.didFinishSelectingPhoto(image, sender: self)
}
}
在其他类中,我有:
class PhotoController: CameraViewDelegate {
和
func didTapCancel(sender: CameraView) {
dismissViewControllerAnimated(true, completion: nil)
RootViewController.shared().navigateToHome()
}
func didFinishSelectingPhoto(image: UIImage, sender: CameraView) {
let photo = MyPhoto(image: image)
sendPhoto(photo)
dismissViewControllerAnimated(true, completion: nil)
}
这工作95%的时间,但我得到一个奇怪的错误,委托有时无法回应。如果我点击按钮取消或发送图片,按钮似乎按下但没有任何反应。我知道这是代理无法响应,因为CameraView中不使用委托的其他按钮仍能正常工作。
任何想法?
调试提示。尝试暂时从delegate
属性中删除weak
限定符。您可能会很快释放您的代理对象(即,它为零strong references)。
如果这能解决你的问题,那么你发现你的错误,恭喜!请再次插入weak
限定符,以免不必要地泄漏内存 - 并记住在其他地方保留强烈的参考:-)
你应该让与_how一个例子来保持强引用它elsewhere_编辑你的问题。 – nayem
谢谢,我试过了,但仍然失败。 – charliework
我认为你必须指定其他视图控制器委托=自己,你从推摄像头
检查,如果你设置delegate
当你初始化你的相机视图。尝试像这样:
let cameraView = CameraView()
cameraView.delegate = self
你是如何设置'CameraView'类的委托属性在_other class_? – nayem
当你做超快的事情时会发生吗?请参阅[这里](http://*.com/a/43147376/5175709)。 Paulo的答案可能是危险的,它会造成内存泄漏。 – Honey
@Honey这只是一个快速而肮脏的调试技巧,哈哈!无论如何,改进的答案是让OP保持正确的轨道。感谢您的反馈! –