代码之家  ›  专栏  ›  技术社区  ›  mjdth

确定视图是否在弹出视图中

  •  16
  • mjdth  · 技术社区  · 15 年前

    我们在应用程序中在 UINavigationControllers . 偶尔 UINavigationController S在Popover视图中。现在,我们放入导航控制器的视图修改了导航控制器的工具栏按钮,在某些情况下,使用我们创建的自定义按钮。我们需要能够从 UIViewcontroller 如果视图在popOverview中,那么我们可以显示正确颜色的按钮。

    我们可以很容易地从uiviewcontroller获取导航控制器引用,使用 UIViewController.navigationController 但似乎找不到任何东西 UIPopoverController .

    有人对怎么做有什么好主意吗?

    谢谢!

    13 回复  |  直到 7 年前
        1
  •  3
  •   hyperspasm    15 年前

        UIView *v=theViewInQuestion;        
        for (;v.superview != nil; v=v.superview) {
            if (!strcmp(object_getClassName(v), "UIPopoverView")) {
                NSLog(@"\n\n\nIM IN A POPOVER!\n\n\n\n");
            }
    

    theViewInQuestion =  theViewControllerInQuestion.view;
    

        2
  •  7
  •   bish    11 年前

    UIPopoverPresentationController .arrowDirection

    viewWillApear()

    // get it from parent NavigationController
    UIPopoverPresentationController* popoverPresentationVC = self.parentViewController.popoverPresentationController; 
    if (UIPopoverArrowDirectionUnknown > popoverPresentationVC.arrowDirection) {
    // presented as popover
    } else {
    // presented as modal view controller (on iPhone)
    }
    
        3
  •  6
  •   SpareTime    15 年前

    #import "Foundation/Foundation.h"
    
    @protocol PopoverSensitiveController 
    -(void) setIsInPopover:(BOOL) inPopover;
    @end
    

    #import 
    #import "PopoverSensitiveController.h"
    
    #pragma mark -
    #pragma mark Interface
    @interface MyViewController : UIViewController  {
    }
    
    #pragma mark -
    #pragma mark Properties
    @property (nonatomic) BOOL isInPopover;
    
    #pragma mark -
    #pragma mark Instance Methods
    ...other stuff...
    @end
    

    #import "MySplitViewControllerDelegate.h"
    #import "SubstitutableDetailViewController.h"
    #import "PopoverSensitiveController.h"
    
    #pragma mark -
    #pragma mark Implementation
    @implementation MySplitViewControllerDelegate
    
    #pragma mark -
    #pragma mark UISplitViewControllerDelegate protocol methods
    -(void) splitViewController:(UISplitViewController *) splitViewController willHideViewController:(UIViewController *) aViewController withBarButtonItem:(UIBarButtonItem *) barButtonItem forPopoverController:(UIPopoverController *) pc {
    
      // Keep references to the popover controller and the popover button, and tell the detail view controller to show the button
      popoverController = [pc retain];
      popoverButtonItem = [barButtonItem retain];
      if ([[splitViewController.viewControllers objectAtIndex:1] respondsToSelector:@selector(showRootPopoverButtonItem:)]) {
          UIViewController *detailViewController = [splitViewController.viewControllers objectAtIndex:1];
          [detailViewController showRootPopoverButtonItem:barButtonItem];
      }
      if ([[splitViewController.viewControllers objectAtIndex:1] respondsToSelector:@selector(showRootPopoverButtonItem:)]) {
          UIViewController *detailViewController = [splitViewController.viewControllers objectAtIndex:1];
          [detailViewController showRootPopoverButtonItem:barButtonItem];
      }
    
      // If the view controller wants to know, tell it that it is a popover
      if ([aViewController respondsToSelector:@selector(setIsInPopover:)]) {
        [(id) aViewController setIsInPopover:YES];
      }
    
      // Make sure the proper view controller is in the popover controller and the size is as requested
      popoverController.contentViewController = aViewController;
      popoverController.popoverContentSize = aViewController.contentSizeForViewInPopover;
    
    }
    
    -(void) splitViewController:(UISplitViewController *) splitViewController willShowViewController:(UIViewController *) aViewController invalidatingBarButtonItem:(UIBarButtonItem *) barButtonItem {
    
      // Tell the detail view controller to hide the button.
      if ([[splitViewController.viewControllers objectAtIndex:1] respondsToSelector:@selector(invalidateRootPopoverButtonItem:)]) {
        UIViewController *detailViewController = [splitViewController.viewControllers objectAtIndex:1];
        [detailViewController invalidateRootPopoverButtonItem:barButtonItem];
      }
    
      // If the view controller wants to know, tell it that it is not in a popover anymore
      if ([aViewController respondsToSelector:@selector(setIsInPopover:)]) {
        [(id) aViewController setIsInPopover:NO];
      }
    
      // Now clear out everything
      [popoverController release];
      popoverController = nil;
      [popoverButtonItem release];
      popoverButtonItem = nil;
    
    }
    
    -(void) setPopoverButtonForSplitViewController:(UISplitViewController *) splitViewController {
    
      // Deal with the popover button
      UIViewController *detailViewController = [splitViewController.viewControllers objectAtIndex:1];
      [detailViewController showRootPopoverButtonItem:popoverButtonItem];
    
      // If the view controller wants to know, tell it that it is a popover (initialize the controller properly)
      if ([[splitViewController.viewControllers objectAtIndex:0] respondsToSelector:@selector(setIsInPopover:)]) {
        [(id) [splitViewController.viewControllers objectAtIndex:0] setIsInPopover:YES];
      }
    
    }
    
    

        4
  •  5
  •   Artem Goryaev    11 年前

        5
  •  3
  •   GnarlyDog    13 年前

    for (UIView *v = self.view; v.superview != nil; v=v.superview) { 
    
        if ([v isKindOfClass:[NSClassFromString(@"_UIPopoverView") class]]) {
    
            NSLog(@"\n\n\nIM IN A POPOVER!\n\n\n\n");
    
        }
    }
    

        6
  •  2
  •   Vlad David Abaev    10 年前

    - (BOOL)isContainedInPopover
    {
        UIPopoverPresentationController* popoverPresentationVC = self.parentViewController.popoverPresentationController;
        return (popoverPresentationVC != nil);
    }
    

    popoverPresentationController

        7
  •  1
  •   Stian Høiland    14 年前

    /* MasterViewController.h */
    
    #import "UIPopoverViewDelegate.h"
    
    @interface masterViewController : UITableViewController <UIPopoverViewDelegate>
    @property (nonatomic) BOOL isInPopover;
    @end
    

    /* MasterViewController.m */
    
    #import "MasterViewController.h"
    
    @implementation MasterViewController
    
    @synthesize isInPopover = _isInPopover;
    
    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
    
        if (self.isInPopover)
        {
            // Code for appearing in popover
        }
        else
        {
            // Code for not appearing in popover
        }
    }
    
    @end
    

    /* DetailViewController.h */
    
    #import "UIPopoverViewDelegate.h"
    
    @interface detailViewController : UIViewController <UISplitViewControllerDelegate>
    @end
    

    /* DetailViewController.m */
    
    #import "DetailViewController.h"
    
    @implementation detailViewController
    
    - (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
    {
    
        /* This method is called when transitioning to PORTRAIT orientation. */
    
        UIViewController *hiddenViewController = [(UINavigationController *)viewController childViewControllers].lastObject;
    
        if ([hiddenViewController respondsToSelector:@selector(setIsInPopover:)])
            [(id <UIPopoverViewDelegate>)hiddenViewController setIsInPopover:YES];
    }
    
    - (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
    {
    
        /* This method is called when transitioning to LANDSCAPE orientation. */
    
        UIViewController *shownViewController = [(UINavigationController *)viewController childViewControllers].lastObject;
    
        if ([shownViewController respondsToSelector:@selector(setIsInPopover:)])
            [(id <UIPopoverViewDelegate>)shownViewController setIsInPopover:NO];
    }
    
    @end
    

    /* UIPopoverViewDelegate.h */
    
    @protocol UIPopoverViewDelegate
    @required
    -(void)setIsInPopover:(BOOL)inPopover;
    @end
    
        8
  •  1
  •   Markicevic    7 年前

    func presentationController(_ controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? {
    
        (controller.presentedViewController as? YourViewControler).isPopover = false
    
        return controller.presentedViewController
    }
    

    class AdvisorHomeFilterViewController: UIViewController {
    
        // MARK: - Properties
    
        var isPopover = true
    }
    

        9
  •  0
  •   JScarry    14 年前

    - (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 --}
    
        10
  •  0
  •   John Doe    12 年前

    - (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;
    }
    
        11
  •  0
  •   testing    10 年前

    isInPopover popoverControllerDidDismissPopover viewWillDisappear

        12
  •  0
  •   amadour    10 年前

    self.popoverPresentationController self.popoverPresentationController.presentingViewController self

        13
  •  0
  •   4tuneTeller    7 年前

    extension UIViewController

    func isInPopover() -> Bool {
        guard UIDevice.current.userInterfaceIdiom == .pad else { return false }
    
        var checkingVC: UIViewController? = self
        repeat {
            if checkingVC?.modalPresentationStyle == .popover {
                return true
            }
            checkingVC = checkingVC?.parent
        } while checkingVC != nil
        return false
    }