iOS - Раскадровка - Делегат для всплывающих окон - PullRequest
8 голосов
/ 17 ноября 2011

Я использую раскадровку в своем приложении для ipad и успешно могу выполнять переходы, использовать сегменты и т. Д. В настоящее время я показываю контроллер всплывающего окна одним нажатием кнопки.Я хочу определить, когда всплывающее окно отклоняется.Как я могу это сделать?

Ответы [ 5 ]

14 голосов
/ 15 июня 2012

Вот что я сделал:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"popover"])
    {
        UIStoryboardPopoverSegue *pop = (UIStoryboardPopoverSegue*)segue;
        pop.popoverController.delegate = self;
    }
}
7 голосов
/ 17 ноября 2011

UIPopoverController

Теперь, с моим откровением, что вы говорите о UIPopoverController, вот шаги:

  1. Установите UIPopoverController с соответствующим делегатом (я предполагаю, что контроллер представления "отправитель")
  2. Пусть ваш "отправитель" соответствует UIPopoverControllerDelegate
  3. Реализация сообщения – popoverControllerDidDismissPopover: и логика обнаружения здесь
  4. Реализуйте - prepareForSegue:sender: и используйте segue destinationController, чтобы одновременно получить ссылку и установить делегата, как показано ниже:

    ((MyViewController *) segue.destinationController) .delegate = self;


Контроллер модального вида

  1. Добавление делегата в представляемый контроллер представления
  2. Назовите ваш переход, если вы еще этого не сделали
  3. У вашего базового контроллера навесного оборудования - prepareForSegue:sender: (см. UIViewController documentation)
  4. Назначьте отправляющий контроллер вида в качестве делегата контроллера модального вида в prepareForSegue:sender:
  5. Вызовите нужный метод для делегата непосредственно перед или после вызова dismissModalViewControllerAnimated:

Вот как я бы подошел к этому. Я также рекомендовал бы иметь официальный протокол для соответствия вашего отправляющего контроллера представления.

4 голосов
/ 01 января 2012

Создайте контроллер представления в представлении:

@property (strong, nonatomic) UIStoryboardPopoverSegue* popSegue;

В XIB создайте идентификатор, называемый «popover» для представления.

В интерфейсе напишите следующий код:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if( [[segue identifier] isEqualToString:@"popover"] )
    {
        //[[segue destinationViewController] setDelegate:self];
        NSLog(@"%@",[[segue destinationViewController] viewControllers]);
        self.popSegue = (UIStoryboardPopoverSegue*)segue;
.
.
.
}

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

[self.popSegue.popoverController dismissPopoverAnimated:YES];        
1 голос
/ 22 июля 2015

Поскольку UIStoryboardPopoverSegue устарела в iOS 9, вы можете использовать UIStoryboardPopoverPresentationSegue.

Затем в prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) вы можете установить делегата следующим образом:

Swift:

if let identifier = segue.identifier where identifier == "showPopover" {
    let destVC = segue.destinationViewController as! UIViewController

    destVC.popoverPresentationController?.delegate = self
}
0 голосов
/ 26 мая 2016

Код Objective-C для вопроса приведен ниже.

if ([segue.identifier isEqualToString:@"home_login"]) 
{
   UIViewController *dest = segue.destinationViewController;
   dest.popoverPresentationController.delegate = self;
}

- (BOOL) popoverPresentationControllerShouldDismissPopover:(UIPopoverPresentationController *)popoverPresentationController
{
    return NO;
}
...