Всплывающие окна не могут быть представлены из вида, который не имеет окна


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

"Popovers cannot be presented from a view which does not have a window."
13 53

13 ответов:

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

подождите, пока

- (void) didMoveToWindow

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

то, что спасло мне жизнь:

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

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

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

у меня есть эта проблема.

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

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

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

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

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

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

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

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

мой presentPopoverFromRect звонок внутри моей

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

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

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

- (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's view controllers array.
    NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, detailNavigationController, nil];
    splitViewController.viewControllers = viewControllers;

    [detailNavigationController release];
    [viewControllers release];

    // Dismiss the popover if it's 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... Я дальнейшее расследование.

эта ошибка также произошла, когда параметр inView: неверен-для проверки попробуйте самостоятельно.посмотреть

да, вы правы, но все же мы можем добавить в него подвид из родительского класса. таким образом, он может быть представлен из вида, который имеет окно:

[popoverController.contentViewController.view addSubview:mySubView];

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

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

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

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

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

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

С. П., Все это началось потому, что я хотел добавить и кнопку "инфо" для меня UIToolBar. Это не один в списке, предоставленном системой, и должен быть.

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

 [self.view addSubview:displayPopOverVC];

где displayPopOverVC является контроллером представления, из которых всплывающем окне появляется

У меня была такая же проблема, после добавления 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.вид должен быть вызван после viewDidLoad, как предложено @hey68You и MobiMaciek..

Я заменил

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

С

[actionSheet showInView:self.view];