协议代表有时不工作

时间:2017-04-05 15:43:37

标签: ios swift delegates protocols weak-references

我遇到的问题是协议委托不总是响应。这是我的实施:

protocol CameraViewDelegate: class {
    func didTapCancel(sender: CameraView)
    func didFinishSelectingPhoto(image: UIImage, sender: CameraView)
}

在CameraView类中,我有:

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

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

调试提示。尝试暂时从weak媒体资源中删除delegate限定符。您可能会过早地释放您的委托对象(即,strong references 为零)。

如果这可以解决您的问题,那么您就找到了自己的错误,恭喜!请再次插入weak限定符,以免不必要地泄漏内存 - 并记住在其他地方保留强大的引用: - )

答案 1 :(得分:0)

我认为你必须在推动相机的地方指定其他视图控制器delegate = self

答案 2 :(得分:0)

检查初始化摄像机视图时是否设置了delegate。尝试类似:

let cameraView = CameraView() 
cameraView.delegate = self