Есть некоторые визуальные проблемы с вашим решением Кори.
Два варианта, которые можно рассмотреть - просто удалите или измените действие кнопки, которая представляет всплывающее окно.
Вариант 1, удерживайте указатель на действие кнопки, и после того, как появится всплывающее окно, установите для действия значение nil. После увольнения всплывающего окна восстановить исходное действие.
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
action = [sender action];
[sender setAction:nil];
self.currentPopover = [(UIStoryboardPopoverSegue *)segue popoverController];
self.currentPopover.delegate = self;
}
-(BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController
{
[self.navigationItem.rightBarButtonItem setAction:action];
return YES;
}
Таким образом, всплывающее окно может появиться только один раз и будет отклонено, как и ожидалось.
Второй вариант - изменить функцию кнопки так, чтобы при появлении всплывающего окна нажатие кнопки приводило к его отклонению.
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
action = [sender action];
target = [sender target];
[sender setTarget:self];
[sender setAction:@selector(dismiss:)];
self.currentPopover = [(UIStoryboardPopoverSegue *)segue popoverController];
self.currentPopover.delegate = self;
}
-(void)dismiss:(id)sender
{
[self.navigationItem.rightBarButtonItem setAction:action];
[self.navigationItem.rightBarButtonItem setTarget:target];
////or
// [sender setAction:action];
// [sender setTarget:target];
[self.currentPopover dismissPopoverAnimated:YES];
}
-(BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController
{
[self.navigationItem.rightBarButtonItem setAction:action];
[self.navigationItem.rightBarButtonItem setTarget:target];
return YES;
}