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

Popovers нельзя представить с точки зрения, которая не имеет окна

Что указывает эта ошибка:

"Popovers cannot be presented from a view which does not have a window."
4b9b3361

Ответ 1

Представление, в которое вы добавляете popover, должно быть уже добавлено в окно с помощью метода addSubview:.

Попробуйте до тех пор, пока

- (void) didMoveToWindow

вызывается для представления и затем загружает popover

Ответ 2

вещь, которая спасла мою жизнь:

if (self.view.window != nil)
    [popoverController presentPopoverFromRect:CGRectMake(44, yCoord, 111, 111) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];

добавив, если условие больше не терпит крах. Я действительно не понимаю, потому что функция presentPopoverFromRect вызвана ВСЕГДА. Нет ситуации, когда окно будет нулевым, но в любом случае это сделало трюк.

edit: У меня этот код в viewDidAppear. Тем не менее в большинстве случаев достаточно переместить presentPopoverFromRect в viewDidAppear или didMoveToWindow, но в моем случае по какой-либо причине условие If было необходимо.

Ответ 3

У меня возникла эта проблема.

В качестве детального представления у меня был UITabBarController, и я установил barButtonItem как leftBarButtonItem на всех трех навигационных контроллерах в панели вкладок.

vcChart.navigationItem.leftBarButtonItem = barButtonItem;
vcAnalysis.navigationItem.leftBarButtonItem = barButtonItem;
vcTechnicals.navigationItem.leftBarButtonItem = barButtonItem;

Выключает только последнее добавленное значение, и предыдущие два будут бросать исключение при нажатии.

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

Ответ 4

Только что столкнулся с этой проблемой. Выяснилось, что параметр inView: использует IBOutlet, который не был подключен в IB. Таким образом, была предпринята попытка запустить popover в ноль. Это не работает.

Итак, убедитесь, что вы используете действительный вид.

Ответ 5

Есть много способов добраться до этой ошибки. В основном вам нужно ждать, чтобы вызвать команду presentPopover, пока ваше окно вызова не будет добавлено в окно. Я сделал это так.

- (void)viewDidAppear:(BOOL)animated
{
    [self methodThatDisplaysPopOver];
}

Мой presentPopoverFromRect вызов находится внутри моей функции methodThatDisplaysPopOver.

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

if (self.view.window != nil)
    [popoverController presentPopoverFromRect:CGRectMake(10, 10, 100, 100) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];

Однако, я думаю, было бы лучше понять, когда будет присвоен self.view.window и убедитесь, что вы представили вам popover после того, как в окне есть окно.

Ответ 6

Я получил такое же сообщение об ошибке при назначении того же UIBarButtonItem нескольким навигационным элементам, что и Льюис. Мой пример был несколько более сложным, поскольку я использовал UISplitViewController.

В моем RootViewController у меня есть массив массивов для выполнения нескольких разделов внутри моей таблицы. Каждый раз, когда пользователь щелкает строку в таблице, в правой панели моего splitViewController помещается новый контроллер представления "подробно". До установки leftBarButtonItem = nil я получил бы segfault после 3-4 щелчков кнопки "Меню" с той же ошибкой, что и a111. Я обновил свой код, чтобы на самом деле получить предыдущий контроллер подробного представления и установить для элемента leftBarButtonItem значение nil.

allData - это мой NSMutableArray, который содержит несколько других NSMutableArrays в качестве объектов.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    // Retrieve the new detail view controller
    UIViewController *detailViewController = [[self.allData objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];

    // Add the detail view controller to a navigation controller and set the bar style
    UINavigationController *detailNavigationController = [[UINavigationController alloc] initWithRootViewController:detailViewController];
    detailNavigationController.navigationBar.barStyle = [[NSUserDefaults standardUserDefaults] integerForKey:@"UIBarStyle"];

    // Retrieve previous detail view controller and remove the leftBarButtonItem
    UINavigationController *previousDetailNavigationController = [splitViewController.viewControllers objectAtIndex:1];
    UIViewController *previousDetailViewController = [[previousDetailNavigationController viewControllers] lastObject];
    previousDetailViewController.navigationItem.leftBarButtonItem = nil;

    // Update the split view controller view controllers array.
    NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, detailNavigationController, nil];
    splitViewController.viewControllers = viewControllers;

    [detailNavigationController release];
    [viewControllers release];

    // Dismiss the popover if it present.
    if (popoverController != nil) {
        [popoverController dismissPopoverAnimated:YES];
    }

    // This sets the left bar to nil when in landscape and equal to "Menu" when in portrait.
    // We need to remove rootPopoverButtonItem from the previous viewController...
    detailViewController.navigationItem.leftBarButtonItem = rootPopoverButtonItem;
} 

Сообщение об ошибке было слегка обмануто сначала, но ответы выше помогли мне. Интересно, почему я мог нажать кнопку "Меню" до 3-4 раз до segfault... Далее я буду исследовать.

Ответ 7

Эта ошибка также возникает, когда inView: параметр неверен - для проверки try self.view

Ответ 8

да, вы правы, но все же мы можем добавить subview из родительского класса в нем. поэтому он может быть представлен с представлением, имеющим окно:

[popoverController.contentViewController.view addSubview:mySubView];

Ответ 9

У меня было такое же сообщение об ошибке, что и OP, в очень похожей ситуации, о которой сообщал TPoschel, за исключением того, что у меня был контроллер с разделенным представлением со встроенным контроллером панели вкладок на панели подробностей и контроллер навигации внутри этого. Элемент кнопки панели добавляется как панель навигации leftBarButtonItem.

Только на iOS5.0 (не 5.1) кажется, что вам требуется аннулировать элемент кнопки на панели вкладок, который вы оставляете, установив его на нуль. Перед тем, как добавить панель на панель навигации на вкладке, вы собираетесь.

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

Я бы поддержал ответ TPoschel, за исключением того, что SO не позволит мне.

Ответ 10

У меня была такая проблема. Получил это сообщение, щелкнув настраиваемый элемент UIBarButton, который вызвал метод селектора с помощью функции performSeque.

Проблема заключалась в том, что мой segue все еще был привязан к элементу UIBarButton. Он должен быть прикреплен к главному виду контроллера вида. Изменено и отлично работает.

P.S., все это началось, потому что я хотел добавить и кнопку "info" на мой UIToolBar. Это не один из представленных в системе списков и должен быть.

Ответ 11

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

 [self.view addSubview:displayPopOverVC];

где displayPopOverVC - это контроллер вида, из которого появляется popOver

Ответ 12

У меня была та же проблема, после добавления PresentPopOver в viewDidAppear это было решено

- (void) viewDidAppear:(BOOL)animated{
     CGRect popoverRect = screenBounds;         
     popoverRect.size.width = MIN(popoverRect.size.width,0) ;
     popoverRect.origin.x  = screenBounds.origin.x;

     [popoverController
     presentPopoverFromRect:popoverRect
     inView:self.view
     permittedArrowDirections:UIPopoverArrowDirectionAny
     animated:YES];
}

это происходило как inView: self.view следует вызывать после viewDidLoad, как было предложено @hey68You и MobiMaciek..

Ответ 13

Я заменил

[actionSheet showFromBarButtonItem:self.navigationController.navigationItem.leftBarButtonItem animated:YES];

с

[actionSheet showInView:self.view];