Отклонение UIPopoverController при использовании ABNewPersonViewController

У меня есть кнопка «добавить контакт», с помощью которой на iPhone я представляю контроллер навигации с контроллером корневого представления ABNewPersonController модально.

Если на iPad у меня есть всплывающее окно, которое я могу отображать с помощью контроллера нового человека внутри - хорошо.

Проблема возникает при попытке уволить.

Я могу закрыть всплывающее окно, нажав «Готово» или «Отменить» в моей реализации didCompleteWithNewPerson using;

if(self.popoverController != nil)
    [popoverController dismissPopoverAnimated:YES];  

Тем не менее, это не означает, что вы касаетесь вне всплывающего окна.

Я вернул ДА для моего метода popoverControllerShouldDismissPopover и установил делегат моего всплывающего окна на this. Я поместил NSLOG в этот метод, и он не пропадает - я что-то упускаю?

Кто-нибудь знает, как убрать всплывающее окно при касании снаружи?

Обновление - дополнительный код

-(IBAction)contactsClicked:(id) sender{

    ABNewPersonViewController *newPersonView = [[ABNewPersonViewController alloc] init];
    [newPersonView setNewPersonViewDelegate:self];
    [newPersonView setDisplayedPerson:newPerson];

        UINavigationController *addContactNavController = [[UINavigationController alloc] initWithRootViewController:newPersonView];
        [newPersonView release];


        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

            if(self.popoverController == nil){
                UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:addContactNavController];

                self.popoverController = popover;
                self.popoverController.delegate = self;
                [popover release];
            }
            CGRect frame = [sender frame];
            [popoverController presentPopoverFromRect:frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionRight animated:YES];
        } else {
            [self presentModalViewController:addContactNavController animated:YES];
            [addContactNavController release];
        }
    }
-(void)unknownPersonViewController:(ABUnknownPersonViewController *)unknownPersonView didResolveToPerson:(ABRecordRef)person{
    [self dismissModalViewControllerAnimated:YES];
}
-(void)newPersonViewController:(ABNewPersonViewController *)newPersonViewController didCompleteWithNewPerson:(ABRecordRef)person {
    NSLog(@"DONE OR CANCEL clicked!!!!"); //prints
    if (self.popoverController != nil) {
        [popoverController dismissPopoverAnimated:YES];
    }
    [self dismissModalViewControllerAnimated:YES];
}

Кнопки «Готово» и «Отмена» на новом контроллере работают, закрывая контроллер и всплывающее окно (при работе на iPad). Я предполагаю, что это означает, что делегат для ABNewPersonViewController реализован правильно. (?)

Я предполагаю, что могу запутать проблему из-за наличия нескольких контроллеров, а мой метод делегата всплывающего окна скрывается или что-то в этом роде?

заранее спасибо

EDIT - метод делегирования

-(BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)thePopoverController{
    NSLog(@"clicked outside the popover");//never prints
    return YES;
    }

person mizzle    schedule 30.09.2010    source источник


Ответы (1)


Из документов:

Касания внутри всплывающего окна не приводят к автоматическому закрытию всплывающего окна. Код вашего представления и контроллера представления должен явно обрабатывать действия и события внутри всплывающего окна и при необходимости вызывать метод dismissPopoverAnimated :.

Вы должны использовать методы делегата popover –popoverControllerShouldDismissPopover:, чтобы подслушивать, когда он будет отклонен, и сделать там свое сохранение и т. Д.

Кроме того, вы должны использовать self, а не this.

person nevan king    schedule 30.09.2010
comment
Я реализовал -popoverControllerShouldDismissPopover, как упоминалось в OP, но, похоже, сюда никогда не попадает контроль. Я имел в виду себя (фон С #) - person mizzle; 01.10.2010
comment
Вы установили свой объект как UIPopoverControllerDelegate? - person nevan king; 01.10.2010
comment
@nevan да. Это прикосновение за пределами всплывающего окна, которое я хочу вызвать. - person mizzle; 01.10.2010
comment
Вам нужно будет опубликовать больше кода. Похоже, вы неправильно настроили делегата. - person nevan king; 01.10.2010
comment
В этом коде нет методов делегата. Вы реализовали –popoverControllerShouldDismissPopover: и соответствовали ли UIPopoverControllerDelegate? - person nevan king; 04.10.2010
comment
Я согласовал и добавил метод dimiss выше - person mizzle; 04.10.2010