unwind segue - открива кога анимацията завършва

Обичам да използвам unwind segues, но попаднах на проблем...

Имам родителски контролер (наречете го Начало), който представя дете модално (наречете го Подробности).

Контролерът Detail има табличен изглед, който показва колекция от основни обекти с данни, и имам бутон Изтриване, когато се докосне, искам да изтрия всички тези обекти и да отхвърля модала, и да актуализирам домашния контролер, за да покажа, че обектите са били изтрити.

Първият ми опит за self.context.deleteObject(entity), последван от размотаване, проработи, освен в ситуацията, в която има достатъчно обекти, които табличният изглед може да превърта с инерция, и бутонът Изтриване е докоснат, докато таблицата все още забавя. Което причинява срив :(

Доколкото мога да разбера, това е, защото току-що изтрих обектите, но тъй като изгледът на таблицата все още се превърта (докато анимацията за отхвърляне завършва), tableView се опитва да премахне клетките, които предстои да се появят (поради превъртането), но след това се срива защото вече няма обекти.

  • Ако viewDidAppear беше извикан, когато изглед на модел е отхвърлен, бих могъл да актуализирам Home там (но не се извиква).

  • Ако секцията за отвиване имаше затваряне, което беше извикано, когато анимацията завърши, бих могъл да актуализирам Home там (но не е, доколкото мога да намеря).

Така че засега извиквам ръчно dismissViewControllerAnimated и използвам затварянето там, за да опресня домашния контролер...

if let nc = self.presentingViewController as? UINavigationController, home = nc.topViewController as? HomeViewController {

    self.dismissViewControllerAnimated(true, completion: { _ in
        self.model.deleteEntities()
        home.refresh()

    })
}

Което работи, но ми се струва грешно (предполагам, защото смятам, че е „лошо“ контролерът Detail да знае за контролера Home). Някакви съвети кой би бил по-добрият подход?


person MathewS    schedule 03.09.2015    source източник


Отговори (1)


В viewWillDisappear: на представения изглед контролер или в viewWillAppear: на представящия изглед контролер, вземете self.transitionCoordinator и извикайте notifyWhenInteractionEndsUsingBlock: - блокът ще бъде извикан точно когато блокът за завършване от dismissViewController би бил, когато анимацията приключи.

person matt    schedule 03.09.2015
comment
Ако viewDidAppear е извикан, когато модален изглед е отхвърлен, той е се извиква, така че не разбирам напълно това условно... - person matt; 03.09.2015
comment
Благодаря! notifyWhenInteractionEndsUsingBlock: е точно това, което исках! Настройвам го в режим на подготовка за преминаване и използвам размотаването. Също така бях изненадан, че viewWillAppear: не се извиква, но мисля, че е защото използвам персонализиран контролер за представяне, който не заема целия екран. - person MathewS; 03.09.2015
comment
но мисля, че това е, защото използвам персонализиран контролер за представяне, който не заема целия екран. Точно затова - благодаря за добавянето на този детайл. - person matt; 03.09.2015