iOS popover show两次会崩溃

时间:2016-11-23 05:36:09

标签: ios objective-c iphone uialertcontroller

我正在使用objective-c来撰写关于UIAlertControllerStyleActionSheet的{​​{1}}。

我想在iPhone上显示提醒表,在iPad上显示UIAlertcontroller

首先,我设置了popoverPresentationController委托。

当我点击我的按钮时,弹出显示是正确的。

但是我点击了屏幕关闭了popover。它会显示在警告之下。

  

[警告]< _UIPopoverBackgroundVisualEffectView 0x14be52ef0>被要求动画其不透明度。这将导致效果显示为不透明,直到不透明度返回到1。

现在当我点击按钮再次显示弹出视图时。

它将崩溃显示在日志下面。

  

由于未捕获的异常'NSGenericException'而终止应用程序,原因是:'您的应用程序已呈现样式UIAlertControllerStyleActionSheet的UIAlertController()。具有此样式的UIAlertController的modalPresentationStyle是UIModalPresentationPopover。您必须通过警报控制器的popoverPresentationController为此弹出窗口提供位置信息。您必须提供sourceView和sourceRect或barButtonItem。如果在显示警报控制器时不知道此信息,您可以在UIPopoverPresentationControllerDelegate方法-prepareForPopoverPresentation中提供它。        ***第一次抛出调用堆栈:        (0x18d9a41c0 0x18c3dc55c 0x19418a8b0 0x193ac60a8 0x193ac3df4 0x193a08d0c 0x1939faac0 0x19376a22c 0x18d9517dc 0x18d94f40c 0x18d94f89c 0x18d87e048 0x18f2ff198 0x1937e2b50 0x1937dd888 0x10011198c 0x18c8605b8)        libc ++ abi.dylib:以NSException类型的未捕获异常终止

有谁知道如何解决问题?

我的代码如下:

UIPopoverPresentationControllerDelegate

非常感谢。

2 个答案:

答案 0 :(得分:3)

可能是ViewController对象强烈引用的UIAlertControllerUIPopoverPresentationController对象  解雇后,Popover无法释放。

        

我后来发现您的问题是您尝试创建popPresenter   一旦进入viewDidLoad方法并在每次触摸时呈现它   按钮,你应该创建一个新的,你可以将ViewDidLoad代码移动到一个新方法,并通过触摸事件调用它,修复如下:

- (void)makePopover
{
    alertTypeAlertController =  [UIAlertController
                                 alertControllerWithTitle:@"selecte one:"
                                 message:nil
                                 preferredStyle:UIAlertControllerStyleActionSheet];

    alertType1Action = [UIAlertAction
                        actionWithTitle:@"Type1"
                        style:UIAlertActionStyleDefault
                        handler:nil];
    alertType2Action = [UIAlertAction
                        actionWithTitle:@"Type2"
                        style:UIAlertActionStyleDefault
                        handler:nil];
    [alertTypeAlertController addAction: alertType1Action];
    [alertTypeAlertController addAction: alertType2Action];

    // for ipad
    popPresenter = [alertTypeAlertController                                                   popoverPresentationController];

    popPresenter.permittedArrowDirections = UIPopoverArrowDirectionLeft;
    popPresenter.canOverlapSourceViewRect = YES; // adding this line
    popPresenter.delegate = self;
    popPresenter.sourceView = self.theTypeBtn;
    popPresenter.sourceRect = CGRectMake(230, 22, 10, 10);
}
- (IBAction)touchButton:(id)sender {
    [self makePopover];
    [self presentViewController:alertTypeAlertController animated:YES completion:nil];
}

答案 1 :(得分:0)

我只是修改你的代码,请检查它是否正常工作。

f.template