2017-04-05 129 views
2

我有一个协议,委托不总是响应的问题。下面是我的实现:协议委托不工作有时

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中不使用委托的其他按钮仍能正常工作。

任何想法?

+2

你是如何设置'CameraView'类的委托属性在_other class_? – nayem

+0

当你做超快的事情时会发生吗?请参阅[这里](http://stackoverflow.com/a/43147376/5175709)。 Paulo的答案可能是危险的,它会造成内存泄漏。 – Honey

+1

@Honey这只是一个快速而肮脏的调试技巧,哈哈!无论如何,改进的答案是让OP保持正确的轨道。感谢您的反馈! –

回答

1

调试提示。尝试暂时从delegate属性中删除weak限定符。您可能会很快释放您的代理对象(即,它为零strong references)。

如果这能解决你的问题,那么你发现你的错误,恭喜!请再次插入weak限定符,以免不必要地泄漏内存 - 并记住在其他地方保留强烈的参考:-)

+0

你应该让与_how一个例子来保持强引用它elsewhere_编辑你的问题。 – nayem

+0

谢谢,我试过了,但仍然失败。 – charliework

0

我认为你必须指定其他视图控制器委托=自己,你从推摄像头

0

检查,如果你设置delegate当你初始化你的相机视图。尝试像这样:

let cameraView = CameraView() 
cameraView.delegate = self