【问题标题】:calling dismissPopoverAnimated in viewWillDisappear crashes application在 viewWillDisappear 中调用dismissPopoverAnimated 会导致应用程序崩溃
【发布时间】:2015-05-27 13:42:32
【问题描述】:

我有两个ViewControllers。我们称它们为 no1 和 no2。在 no2 中,我有 PopoverViewController 和一些选项和 NSTimer 的实例。如果在弹出窗口中没有单击任何内容,则计时器函数在弹出窗口出现 3 秒后调用 popToViewController,这会将用户返回到 no1 ViewController。问题是当这个函数被触发时,屏幕变成了no1,但是应用程序崩溃并且没有下面的错误消息。

PopoverViewController 没有委托,它被注册为第二个 VC 的属性:

@property (nonatomic)UIPopoverController *optionsPopover;

有人知道为什么没有可用的崩溃报告吗?如果没有提到弹出框为什么它会崩溃?

viewWillDisappear 中的实现如下所示:

if([_optionsPopover isPopoverVisible]){
    [_optionsPopover dismissPopoverAnimated:NO];
    _optionsPopover = nil;
}

我尝试强制 UI 在主线程上更新(代码如下),但结果是一样的。崩溃仍然存在。

dispatch_async(dispatch_get_main_queue(), ^{
    if([_optionsPopover isPopoverVisible]){
        [_optionsPopover dismissPopoverAnimated:NO];
        _optionsPopover = nil;
    }
});

【问题讨论】:

    标签: ios objective-c uiviewcontroller uipopovercontroller


    【解决方案1】:

    请尽量对UIPopoverController做强引用

    @property (nonatomic,retain)UIPopoverController *optionsPopover;
    

    调用下面的方法 - (void)viewDidDisappear:(BOOL)animated 而不是 viewwilldisappear -

    - (void)viewDidDisappear:(BOOL)animated {
    if([_optionsPopover isPopoverVisible]){
        [_optionsPopover dismissPopoverAnimated:NO];
        _optionsPopover = nil;
    }
    }
    

    【讨论】:

    • 我这样做了,但错误仍然存​​在,并且有关崩溃的信息不存在。
    • 我没有。这是主要问题。应用程序崩溃,并且只在主类中显示标记的绿线。
    • 请这个 url 帮助获取崩溃所在的行 - stackoverflow.com/questions/7703052/…
    • 我收到这个错误 *** -[_UIPopoverView layer]: message sent to deallocated instance 0x127d8da20
    • 好的,你的问题,请检查上面
    【解决方案2】:

    将属性设置为强:

    @property (strong, nonatomic) UIPopoverController *_optionsPopover;
    

    删除这行代码:

    _optionsPopover = nil;
    

    【讨论】:

    • 我这样做了,但错误仍然存​​在,并且有关崩溃的信息不存在。
    【解决方案3】:

    您在解雇后将_optionsPopover 设置为零..

    编辑

    可能的问题:viewController 关闭后定时器没有失效,

    if([_optionsPopover isPopoverVisible])
    {
        [yourTime invalidate]; // added on edit
        [_optionsPopover dismissPopoverAnimated:NO];
    }
    

    单独尝试:[_optionsPopover dismissPopoverAnimated:NO];,因为忽略它基本上会使它为零..

    【讨论】:

    • 如果您之前将对象的引用设置为 nil,您如何从对象中调用某些内容?通过这样做,您正在调用空指针引用的函数。
    • 我试过了,但错误仍然存​​在。应用程序崩溃,没有有关崩溃的信息。我已将 NSZombie 添加到项目中。
    • 在此之前你有- invalidate你的计时器吗?也有可能触发了计时器..并且您已经关闭了目标方法所在的视图控制器..
    • 定时器只在时间到期时触发一次。我不会在任何时候调用无效,除非单击弹出窗口中的选项。选项永远不会被点击,我会像这样断点,永远不会被调用。
    • 很难用间隔断点计时器.. >.
    猜你喜欢
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多