Отклонить всплывающее окно с помощью Unwind Segue в Xcode Storyboard

Я использую Xcode 4.5 и новую функцию iOS 6 для раскрутки переходов. Я представляю контроллер навигационного представления внутри всплывающего окна, которое представлено программно из элемента кнопки панели:

- (IBAction)configChartTapped:(id)sender
{
    if (self.popover.isPopoverVisible) {

        [self.popover dismissPopoverAnimated:YES];

    } else {
        UINavigationController *chartConfigNavigationController = [self.storyboard instantiateViewControllerWithIdentifier:@"GrowthChartNavigationController"];

        ConfigChartTypeViewController *configChartTypeViewController = (ConfigChartTypeViewController*) chartConfigNavigationController.topViewController;

        self.popover = [[UIPopoverController alloc]initWithContentViewController:chartConfigNavigationController];
        self.popover.popoverContentSize = CGSizeMake(320, 500);
        self.popover.delegate = self;

        [self.popover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    }
}

Рядом с этим методом я определил цель, чтобы раскрутить переход (т.е. закрыть всплывающее окно)...

- (IBAction)cancelConfig:(UIStoryboardSegue *)segue
{
    //
}

... и подключил его к кнопке отмены на панели навигации контроллеров представления навигации.

Подключение кнопки панели отмены к кнопке cancelConfig отлично работало в Xcode.

Однако при запуске кода ничего не происходит при нажатии кнопки «Отмена», несмотря на то, что Xcode 4.5 должен поддерживать закрытие всплывающих окон при развертывании переходов (согласно документации по выпуску).

Что я пропустил?

Спасибо!


person AlexR    schedule 19.11.2012    source источник
comment
Привет, ты нашел решение этой проблемы? я тоже тут застрял   -  person dan    schedule 03.12.2012
comment
Дэн, к сожалению, я пока не нашел решения этой проблемы. Я все еще использую старое делегирование и надеюсь, что Apple скоро исправит эту проблему. Пожалуйста, дайте мне знать, когда вы нашли решение.   -  person AlexR    schedule 03.12.2012


Ответы (1)


Переходы раскрутки используют поиск во время выполнения, сначала запрашивая родительский контроллер представления, чтобы пройти по цепочке контроллеров представлений, представленных через переход, пока он не найдет правильный метод раскрутки. Но здесь нет цепочки, так как всплывающее окно было создано программно, а не с переходом всплывающего окна.

Никаких обратных вызовов не происходит, поскольку нет обратной ссылки на родительский контроллер представления. Сегменты раскрутки — это абстрактная форма делегирования, поэтому это похоже на то, что вы забыли установить делегат и не получили никаких обратных вызовов.

Решение состоит в том, чтобы создать всплывающее окно с переходом в Интерфейсном Разработчике, а не создавать его программно с помощью метода configChartTapped:.

Шаги:

Во-первых, перетащите элемент кнопки панели в представленном контроллере представления на представленный контроллер представления и выберите переход всплывающего окна:

введите здесь описание изображения

В представляющем контроллере представления реализуйте prepareForSegue:, чтобы получить ссылку на всплывающий контроллер:

- (void)prepareForSegue:(UIStoryboardPopoverSegue *)segue
                 sender:(id)sender {
    self.popover = segue.popoverController;
}

Затем реализуйте shouldPerformSegueWithIdentifier:, чтобы восстановить поведение отображения/скрытия, аналогичное configChartTapped::

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
    if (self.popover.isPopoverVisible) {
        [self.popover dismissPopoverAnimated:YES];
        return NO;
    } else {
        return YES;
    }
}

Наконец, в Interface Builder установите правильный размер содержимого всплывающего окна для представленного контроллера представления:

введите здесь описание изображения

Это позволит вам вернуться к cancelConfig: при нажатии кнопки отмены из всплывающего окна, а также показать/скрыть всплывающее окно при нажатии кнопки, которая представляет его.

person Bryan Luby    schedule 07.02.2013
comment
Это более простой способ проверить ответ stackoverflow.com/questions/28247727/ - person DogCoffee; 29.03.2015