Поповерс не может быть представлен из вида, у которого нет окна - PullRequest
53 голосов
/ 31 июля 2010

Что означает эта ошибка:

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

Ответы [ 13 ]

30 голосов
/ 26 августа 2011

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

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

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

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

24 голосов
/ 01 августа 2010

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

Попробуйте подождать, пока не будет вызван

- (void) didMoveToWindow

вид, а затем загрузить поповер

4 голосов
/ 03 марта 2011

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

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

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

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

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

2 голосов
/ 04 июня 2013

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

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

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

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

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

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

2 голосов
/ 16 августа 2010

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

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

1 голос
/ 25 июля 2013

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

[popoverController.contentViewController.view addSubview:mySubView];
1 голос
/ 06 февраля 2012

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

1 голос
/ 29 июня 2011

Я получил то же сообщение об ошибке при назначении одного и того же 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'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 раз до сегфоута ... Я буду исследовать дальше.

0 голосов
/ 18 августа 2013

я заменил

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

с

[actionSheet showInView:self.view];
0 голосов
/ 22 января 2013

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

...