Определите, находится ли представление внутри представления Popover - PullRequest
16 голосов
/ 16 ноября 2010

У нас есть общие представления, которые мы используем в нашем приложении во многих местах внутри UINavigationControllers. Иногда UINavigationController находятся внутри представлений popover. Теперь представления, которые мы помещаем в контроллеры nav, изменяют кнопки панели инструментов их контроллера навигации и, в некоторых случаях, используют созданные нами пользовательские кнопки. Мы должны быть в состоянии выяснить из самого UIViewcontroller, является ли представление внутри всплывающего окна, чтобы мы могли отображать кнопки правильного цвета.

Мы можем легко получить ссылку на контроллер навигации из UIViewController, используя UIViewController.navigationController, но, похоже, ничего не найдено для поиска UIPopoverController.

У кого-нибудь есть хорошие идеи, как это сделать?

Спасибо!

Ответы [ 13 ]

0 голосов
/ 17 октября 2014

Все приведенные выше решения кажутся немного сложными. Я использую переменную с именем isInPopover, которую я установил в true, если контроллер представления представлен во всплывающем окне. В контроллере вида в popoverControllerDidDismissPopover или в viewWillDisappear я установил логическое значение в false. Это работает и очень просто.

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

Все эти 'Точные подходы к совпадению имен классов' очень подвержены сбоям и ломаются даже при малейших изменениях, которые Apple сделает. Также выполнение one-char-vars и cryptic for-loop не совсем подходит для моего стиля.

Я использую следующий код:

- (BOOL) isInPopOver {
    UIView *currentView = self.view;
    while( currentView ) {
        NSString *classNameOfCurrentView = NSStringFromClass([currentView class]);
        NSLog( @"CLASS-DETECTED: %@", classNameOfCurrentView );
        NSString *searchString = @"UIPopoverView";
        if( [classNameOfCurrentView rangeOfString:searchString options:NSCaseInsensitiveSearch].location != NSNotFound ) {
            return YES;
        }
        currentView = currentView.superview;
    }
    return NO;
}
0 голосов
/ 29 февраля 2012

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

- (void)viewWillAppear:(BOOL)animated {
[self setContentSizeForViewInPopover:CGSizeMake(400, 500)];

NSInteger frameWidth = self.view.frame.size.width;
//Let you go back to the game if on an iPod.
if ( ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) && !(frameWidth == 400) ) { ---code to display a button --}
...