iOS 7 Popover控制器在xcode 6

时间:2015-06-19 09:58:09

标签: ios ipad ios7 storyboard segue

每当我尝试在iOS7上使用UIPopoverController时,我的应用程序崩溃了。据我所知,这是一个最近的问题,只有在内置Xcode 6时才会出现。我没有iOS 7 iPad进行测试,但我收到Crashlytics的信息,有人正在经历这次崩溃。它也会在7.1模拟器中崩溃。

任何帮助,非常感谢。

干杯

我的代码在prepareForSegue:内崩溃:

if ([[segue identifier] isEqualToString:iPadiOS7ColorPickerSegue])
{
    FCColorPickerViewController *colorPickerVC = [segue destinationViewController];
    colorPickerVC.delegate = self;
    colorPickerVC.isPopover = YES;
    self.popVC = [(UIStoryboardPopoverSegue *)segue popoverController]; // <-- This line
}

错误,请注意 UIStoryboardPushSegue ,即使它在故事板中设置为Popover。

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: '-[UIStoryboardPushSegue popoverController]: unrecognized selector sent to instance 0x7a1dd9a0'

Storyboard segue properties

修改

我在一个统一的故事板中设置了视图控制器。此代码正常工作,但在我使用Xcode 6进行最新更新后,我开始收到此错误的崩溃报告。

看来我的segue选择没有得到尊重,因为它似乎调用了UIStoryBoardPushSegue。

3 个答案:

答案 0 :(得分:1)

试试这个:

// write code in .m class

UIPopoverController *PopoverController;

-(void)dealloc
{

    if(self.PopoverController)
    {
        [self.PopoverController dismissMenuAnimated:NO];
    }

}

答案 1 :(得分:1)

我没有调用segue,而是最终分配了我试图呈现为弹出窗口,故事板标识符的布局视图控制器。然后我可以将它用作popoverController的contentViewController。 (我无法访问[segue destinationViewController],因为我不再将其显示为segue)

iPhone上的Push segue,iOS7似乎没有受到影响所以我保持不变。

我必须强调(UIPopoverController*) popVC属性,以便保留引用,然后在解除时将其释放。

下面是我用来检查iOS版本和设备的代码,以及调用它们的segues的位置。

if ([NSProcessInfo instancesRespondToSelector:@selector(isOperatingSystemAtLeastVersion:)]) {
    // conditionally check for any version >= iOS 8 using 'isOperatingSystemAtLeastVersion'
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
        [self performSegueWithIdentifier:kiPadiOS8ColorPickerSegueID sender:nil];
    } else {
        [self performSegueWithIdentifier:kiPhoneiOS8ColorPickerSegueID sender:nil];
    }
} else {
    // we're on iOS 7 or below
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
        //[self performSegueWithIdentifier:kiPadiOS7ColorPickerSegueID sender:nil];

        FCColorPickerViewController *colorPickerVC = [[UIStoryboard storyboardWithName:@"Main" bundle:nil]instantiateViewControllerWithIdentifier:@"ColorPickerPopover"];// = [ destinationViewController];
        colorPickerVC.delegate = self;
        colorPickerVC.isPopover = YES;

        self.popVC = [[UIPopoverController alloc] initWithContentViewController:colorPickerVC];
        [self.popVC presentPopoverFromRect:CGRectMake(0, CGRectGetHeight(self.view.frame) - 50, CGRectGetWidth(self.view.frame), 50) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

    } else { // iPhone, iOS 7
        [self performSegueWithIdentifier:kiPhoneiOS7ColorPickerSegueID sender:nil];
    }

}

答案 2 :(得分:0)

我知道它已经很晚了,但我希望这个解决方案可以帮助其他人。我在我的项目及其工作中使用它。在代码中添加以下方法,使其适用于iPhone:

-(BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender{ 
if ([identifier isEqualToString:iPadiOS7ColorPickerSegue] && IS_IPHONE) {

   FCColorPickerViewController *colorPickerVC = [self.storyboard instantiateViewControllerWithIdentifier:@"FCColorPickerViewController"];
colorPickerVC.delegate = self;
colorPickerVC.isPopover = YES;
 [self presentViewController:colorPickerVC animated:YES completion:NULL];

    return NO;
}

return YES;

}