iOS 6 - програмното задействане на Unwind Segue не прави нищо

При стартиране на приложението ми, то програмно показва LoginViewController, използвайки segue. Контролерът за изглед е представен модално с преход, настроен на кръстосано разтваряне. При успешно удостоверяване искам да отхвърля изгледа за влизане чрез програмно задействане на отпускане. Така че добавих това към моя заглавен файл:

- (IBAction)unwindSegue:(UIStoryboardSegue *)segue;

сега в IB мога да контролирам-плъзгам от „Собственик на файл“ LoginViewController до бутона Изход и избирам unwindSegue:. Това създава ръчно преминаване, което се показва правилно в инспекторите за връзки за собственика на файла и бутона за изход. След това щраквам върху новосъздадения Unwind segue от сцената в IB и след това му давам име. Ако щракна върху бутона „отидете на“ за действието unwind segue, това ме отвежда до декларацията, спомената по-горе.

Дотук добре, след това задействам този преход при успешно удостоверяване в моя GCD блок:

....
dispatch_async(dispatch_get_main_queue(), ^
{
    [self performSegueWithIdentifier:@"UnwindSegueIdentifier" sender:self];

    [self.spinner removeFromSuperview];
    self.spinner = nil;
});

..... и нищо не се случва, когато работи. Спинърът наистина се отстранява правилно, но няма признаци за изпълнение на секцията за отвиване.

Точка на прекъсване в изпълнението на unwindSegue: никога не се достига. Няма хвърлени грешки. Нищо не се записва в конзолата. Идентификаторът е правилен, проверих три пъти (в противен случай така или иначе ще се провали).

Разгледах отговорите тук, тук и тук, но не изглежда да съм пропуснал нищо.

Това, което обаче забелязах, е, че Xcode смята, че unwindSegue: е не свързан: свързан? не е свързан  ?

Не мога да плъзна от малкото празно кръгче пред unwindSegue: и да го свържа с бутона за изход.

Всяка помощ ще бъде оценена.


person Allen Zeng    schedule 19.02.2013    source източник
comment
Защо просто не оставите бутона за изход да задейства преминаването, т.е. да свържете бутона директно?   -  person Matthias    schedule 19.02.2013
comment
Благодаря за отговора ви, но мисля, че може да не се изразих ясно там... Бутонът за изход, за който непрекъснато говорех, беше зеленият бутон за изход, продължаване, а не истински бутон в изгледа   -  person Allen Zeng    schedule 20.02.2013
comment
Какво точно трябва да задейства вашата почивка? И защо трябва да го правите по асинхронен начин, т.е. защо искате да използвате GCD?   -  person Matthias    schedule 20.02.2013
comment
Преминаването се задейства при успешно удостоверяване. Удостоверяването се извършва чрез извикване на уеб услуга.   -  person Allen Zeng    schedule 20.02.2013


Отговори (2)


Ако използвате модален преход, за да отидете на вашия изглед за влизане, всичко, което трябва да се върнете назад, е да се обадите

[self dismissViewControllerAnimated:YES completion:nil];

По-точно, трябва да го извикате на представящия контролер (вашият първи контролер), но той ще бъде препратен, ако се обадите на представения контролер. Можете да използвате блока за завършване, за да извършите необходимото почистване. Няма нужда да използвате GCD.

РЕДАКТИРАНЕ

За да отговоря на допълнителния коментар: не съм много сигурен от вашето описание, но изглежда, че сте внедрили действието за отвиване в представения контролер вместо в представящия контролер. Продълженията за отвиване позволяват да се направи нещо на повикващия (напр. настройка на данни) без допълнителен протокол.

person Matthias    schedule 20.02.2013
comment
Благодаря. Разбирам, че мога да се обадя на dismissViewControllerAnimated:completion:, но съм по-любопитен защо размотаването не работи. Току-що го свързах към бутон, но пак не работи. Също така използването на GCD е така, че извикването на уеб услугата за удостоверяване да не задържа потребителския интерфейс, а не само да отхвърли контролера за преглед на влизане. - person Allen Zeng; 20.02.2013
comment
Напълно си прав! Не внедрих следването на правилното място... Трябваше да го видя по-рано... Благодаря! - person Allen Zeng; 20.02.2013
comment
Забелязах, че Xcode все още отчита метода, който трябва да бъде прекъснат, както показах на екранната снимка. Сигурно е бъг - person Allen Zeng; 20.02.2013

Цитиране на текст от техническата бележка на Apple относно Unwind Segue: За да добавите отвиваща серия, която ще бъде задействана само програмно, control+плъзнете от иконата на контролера за преглед на сцената до нейната икона за изход, след което изберете действие за отвиване за новата серия от изскачащото меню.

Връзка към техническата бележка

person Vishal Chaudhry    schedule 06.11.2013