Popover在iPhone中崩溃

时间:2014-07-30 12:19:18

标签: ios objective-c xcode5 uipopovercontroller uipopover

我正在使用以下代码进行iPad应用程序的popover。它适用于iPad应用程序,但当我使用相同的iPhone代码时,它会在

附近崩溃
" UIPopoverController* removeDefaultPopover=[[UIPopoverController alloc]initWithContentViewController:NavController];"

能帮助我摆脱这个......

 UIViewController  *removeDefaultController = [[UIViewController alloc] init];
        UIView *removeDefaultView = [[UIView alloc] init];
        removeDefaultController.view = removeDefaultView;

        removeDefaultController.contentSizeForViewInPopover = CGSizeMake(100, 100);
        UINavigationController *NavController=[[UINavigationController alloc]initWithRootViewController:removeDefaultController];
        UIPopoverController* removeDefaultPopover=[[UIPopoverController alloc]initWithContentViewController:NavController];
        UIBarButtonItem *edit = [[UIBarButtonItem alloc] initWithTitle:@"EDIT" style:UIBarButtonItemStyleBordered target:self action:@selector(editDefaultLanguage)];
        [removeDefaultController.navigationItem setRightBarButtonItem:edit animated:YES];removeDefaultPopover.delegate=self;
        [removeDefaultPopover presentPopoverFromRect:CGRectMake(0, 0, 100, 100) inView:self.view permittedArrowDirections:NO animated:YES];
        removeDefaultView.backgroundColor=[UIColor redColor];

4 个答案:

答案 0 :(得分:2)

来自documentation

  

Popover控制器仅适用于iPad设备。   尝试在其他设备上创建一个会导致异常。

您必须自己实现类似的功能。

答案 1 :(得分:2)

根据Mark Sands UIPopoverController包含以下代码:

- (id)initWithContentViewController:(UIViewController *)viewController {
  if (([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)]) {
      if ([[UIDevice currentDevice] userInterfaceIdiom] != UIUserInterfaceIdiomPad) {
          if ([UIPopoverController _popoversDisabled]) {
              [NSException raise:NSInvalidArgumentException format:@"-[UIPopoverController initWithContentViewController:] called when not running under UIUserInterfaceIdiomPad."];
          }
      }
  }    
   ...
}

+ (BOOL)_popoversDisabled {
    NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];
    if ([bundleIdentifier isEqualToString:@"com.apple.iBooks"] || [bundleIdentifier isEqualToString:@"com.apple.mobilesafari"] || 
      [bundleIdentifier isEqualToString:@"com.apple.itunesu"] || [bundleIdentifier isEqualToString:@"com.apple.Maps"]) {
      return NO;
  }
  return YES;
}

如您所见,Apple的应用程序已启用UIPopoverController

您可以通过以下方式创建UIPopoverController子类并实现+ _popoversDisabled

+ (BOOL)_popoversDisabled {
  return NO;
}

或者使用method swizzling

答案 2 :(得分:1)

你不能使用" UIPopOverController"适用于iPhone应用程序,因为它仅适用于iPad设备。或者你可以使用CMPopTipView,它的工作方式与UiPopoverController类似。您可以在https://github.com/chrismiles/CMPopTipView

上查看此控件

我在之前的应用程序中使用过此控件,效果很好。

答案 3 :(得分:0)

如前所述,UIPopoverController目前尚未在iPhone应用程序中启用。但是,如果您仍然喜欢我推荐的功能WEPopover。这是多么容易使用:

SettingsViewController *viewController = [[SettingsViewController alloc]init];
self.popover = [[WEPopoverController alloc]initWithContentViewController:viewController];

[self.popover presentPopoverFromRect:self.settingsButton.frame
                              inView:self.view
            permittedArrowDirections:UIPopoverArrowDirectionAny
                            animated:YES];

所有正确的生命周期方法都被调用,它有几种方便的方法用于呈现,解雇等。我已经在几个项目中使用它并且对它非常满意。

使用它时唯一需要注意的是确保对popover对象保持强引用(因此,在我的示例中,您看到我使用self.popover而不是实例变量)。