Всплывающие окна не могут быть представлены из вида, который не имеет окна
что означает эта ошибка указывает:
"Popovers cannot be presented from a view which does not have a window."
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
toviewDidAppear
или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..