Делегатът на протокола понякога не работи

Имам проблем с делегат на протокол, който не винаги отговаря. Ето моята реализация:

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, които не използват делегата, все още работят нормално.

Някакви идеи?


person charliework    schedule 05.04.2017    source източник
comment
как сте задали свойството delegate на вашия CameraView клас в друг клас?   -  person nayem    schedule 05.04.2017
comment
Случва ли се, когато правите нещата супер бързо? Вижте тук. Отговорът на Пауло вероятно е опасен, ще доведе до изтичане на памет.   -  person Honey    schedule 05.04.2017
comment
@Honey Това беше просто бърз и мръсен съвет за отстраняване на грешки, ха-ха! Както и да е, подобрен отговор, за да поддържате OP на правилния път. Благодаря за обратната връзка!   -  person Paulo Mattos    schedule 05.04.2017
comment
@Honey изглежда, че се случва при първото стартиране на нова инсталация последователно. Ако изляза от приложението и го отворя отново, то работи според очакванията.   -  person charliework    schedule 05.04.2017
comment
Просто плюя: много вероятно нещо е nil някъде и докато изпълнявате/изпращате съобщения към него. Вероятно не откривате къде, защото сте безопасно разопаковане. Като някъде като свързания по-горе отговор освобождавате self по-рано или освобождавате обект по-рано. Може да ви помогне да опитате принудително разопаковане, така че да сринете в обекта nil и да го определите. След като го намерите, редактирайте въпроса си с възможния нулев обект   -  person Honey    schedule 06.04.2017


Отговори (3)


Съвет за отстраняване на грешки. Опитайте временно да премахнете квалификатора weak от вашето свойство delegate. Възможно е да пускате делегирания си обект твърде рано (т.е. нула силни препраткикъм него).

Ако това коригира проблема ви, значи сте открили грешката си, поздравления! Моля, вмъкнете отново квалификатора weak, за да не изтичате ненужно памет — и не забравяйте да запазите силна препратка към него другаде :-)

person Paulo Mattos    schedule 05.04.2017
comment
Трябва да дадете пример с как да запазите силна препратка към него другаде. - person nayem; 05.04.2017

Вероятно просто ще използвам превключвател, но всички неща смятат, че това може би е най-простият и чист начин да постигна това, което търся, така че приемам този отговор.
person Arvind Patel    schedule 05.04.2017

Проверете дали сте задали delegate, когато инициализирате изгледа на камерата. Опитайте нещо като:

let cameraView = CameraView() 
cameraView.delegate = self
person Ender    schedule 05.04.2017