Подтвердить что ты не робот

Предупреждение. Попробуйте представить ModalTableViewController на MainTableViewController, который уже представляет (null)

У меня проблема с popover. Если я коснусь ячейки, я загружу popover, чтобы выбрать более подробную информацию. Все работает нормально, но когда я снова нажимаю свою ячейку, я получаю каждый раз следующее сообщение:

Предупреждение: попытка представить ModalTableViewController... на MainTableViewController... который уже представляет (null)

Если я коснусь другой ячейки, я не получу это предупреждение. Только если снова нажмите одну и ту же строку.

Я пробовал много вещей, но я не могу решить эту проблему. Я загружаю свой popover следующим образом:

var popover: UIPopoverController!
var popoverContent: ModalTableViewController!

и на моем ящике:

popoverContent = self.storyboard.instantiateViewControllerWithIdentifier("ModalTableViewController") as ModalTableViewController

popoverContent.selectedQuestionID = indexPath!.row               
popover = UIPopoverController(contentViewController: popoverContent)
popover.delegate = self

popover.presentPopoverFromRect(currentCell.LabelCellTitle.frame, inView: currentCell.LabelCellTitle.superview, permittedArrowDirections: UIPopoverArrowDirection.Left, animated: true)

И отклонить

func popoverControllerDidDismissPopover(popoverController: UIPopoverController!) {

    popover.dismissPopoverAnimated(false) // just to check

    self.popover = nil
    self.popoverContent = nil

}

Любые идеи?

Edit:

Если я проверяю:

if(self.popoverContent == nil) {

прежде чем открыть его, я узнаю, что это не ноль, когда я снова нажимаю одну и ту же ячейку.

Изменить еще раз:

У меня такая же проблема, если я создаю ее с небольшой настройкой:

Пользовательская кнопка 1x1px. Соедините popover с segue. На кнопке перехода ячейки на ячейку и открыть popover.

Таким образом, нет кода для открытия popover, только с редактором раскадровки.

Я получаю одно и то же сообщение об ошибке (иногда), только если я снова коснусь того же popover.

4b9b3361

Ответ 1

Я еще не скоро, но для Objective-C я закончил обертку вызова presentViewController в вызове performSelector.

-(void) present
{
    [self performSelector: @selector(ShowModalTableViewController) withObject: nil afterDelay: 0];
}

-(void) ShowModalTableViewController
{
    [self presentViewController: ctrlModalTableViewController animated: true completion: nil];
}

Ответ 2

У меня была эта проблема, потому что я пытался выполнить segue/present изнутри:

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex

Я изменил его на:

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex

и он исправил это!

Ответ 3

Это также будет работать:

dispatch_async(dispatch_get_main_queue(), ^ {
        [self presentViewController:vc animated:YES completion:nil];
});

Ответ 4

Кажется, это верно для представления чего-либо над popover. Причина, по которой все предыдущие ответы работают, вероятна, потому что любое действие предпринимается до того, как popover (или лист активности или аналогичный) будет отклонен.

Если вы можете, попробуйте сначала отпустить popover, а затем представить свой модальный.

Ответ 5

Это проблема iOS 8 на iPad и не встречается в iOS ниже 8. Вы можете поместить там условие:

if ([controller respondsToSelector:@selector(popoverPresentationController)])
{
    // iOS8
    controller.popoverPresentationController.sourceView = self.view; // or any of your UIiew
}

Но рассмотрите точку Стива также (fooobar.com/questions/110702/...) ниже с этим изменением кода.

Ответ 6

Это происходит, если в момент вызова представления представления нового контроллера представления отображается UIActionSheet, например Этот код работает для меня

    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        [controller presentViewController:modalViewController animated:YES completion:NULL];
    }];

Ответ 7

Просто добавьте этот фрагмент кода в ViewDidLoad() вашего основного uiviewcontroller

 definesPresentationContext = true

Ответ 8

Для меня это произошло, когда у меня было два элемента UIBarButton как часть NavigationItem, и оба имели сгенерированный segue, чтобы открывать представления как popover - со своими собственными контроллерами. Один popover не будет автоматически удаляться при нажатии другого BarButtonItem. Тем не менее, это было бы упущено, когда я постучал в другое место за пределами населенного пункта. Я закончил переопределять UINavigationController и добавил расширенную версию presentViewController:animated:completion

/*
 * Workaround for apparent bug in iPad that popover does not automatically dismiss if another bar button item is pressed
 */

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {

    /*
     * Make sure this runs in the main queue
     */
    dispatch_async(dispatch_get_main_queue(), ^ {
        if (
            [self.presentedViewController isKindOfClass:[ViewController1 class]]
            || [self.presentedViewController isKindOfClass:[ViewController2 class]]
            || [self.presentedViewController isKindOfClass:[ViewController3 class]]
            || [self.presentedViewController isKindOfClass:[ViewController4 class]]
            ) {
            [self dismissViewControllerAnimated:YES completion:^{
                [super presentViewController:viewControllerToPresent animated:flag completion:completion];
            }];
        }

        else {
            [super presentViewController:viewControllerToPresent animated:flag completion:completion];
        }
    });
}

Я считаю, что dispatch_async(dispatch_get_main_queue(), ^ {}) действительно не нужен, я просто добавил его в качестве меры предосторожности.

Ответ 9

В моем случае я случайно связал свою кнопку с IBAction и Storyboard Segue с видом Present As Popover одновременно. Что я сделал, чтобы исправить это, так это удалить ссылку для кнопки Touch Up Inside события Touch Up Inside на IBAction и использовать только Storyboard Segue.