UIActivityViewController调用ViewWillAppear但不调用ViewWillDisappear

时间:2014-09-05 18:16:35

标签: objective-c ios7

我发现对UIActivityViewController的调用没有调用ViewWillDisappear但是当用户从VC返回时,它会调用ViewWillAppear。这个过程分为两步,因为它首先显示半屏幕,允许用户选择文本或电子邮件等内容。取消此处将返回呼叫VC而不调用ViewWillAppear。这可以。但是,如果选择文本等通信选项,VC将替换为从不调用ViewWillDisappear的全屏短信VC。

我可以手动拨打ViewWillDisappear,但这样做我不知道用户是否选择在全屏转换之前在较小的半屏上“取消”。

调用ActivityVC的代码如下:

UIActivityViewController *activityController = [[UIActivityViewController alloc]initWithActivityItems:shareAray 
                                                applicationActivities:nil];

[self presentViewController:activityController
                           animated:YES completion:nil];

返回时未调用ViewWillDisappear的任何原因都会调用ViewWillAppear?无论如何要知道用户是否在之前的较小半屏上点击“取消”,这样我就不会自己拨打ViewWillDisappear,除非他们继续实际的全屏共享?

3 个答案:

答案 0 :(得分:0)

方法presentViewController将导致在呈现的视图控制器上调用viewWillAppear:,随后将在呈现的<上调用viewWillDisappear: / strong>查看控制器何时即将消失。要拦截这些调用,请继承UIActivityViewController并实现对这些方法的覆盖。

至于如何判断用户是否取消,我建议按照Windows Forms的常用方式进行操作。添加某种类型的公共“对话框结果”属性(可能只显示为get - ),该属性设置为某个值范围之一,因此调用(或呈现)视图控制器可以告诉为什么被叫(或者在这种情况下self.presentedViewController)被解雇了。

答案 1 :(得分:0)

正如Gutblender在上面的交流中指出的那样,由于modalPresentationStyle,UIActivityVC没有调用ViewWillDisappear。感觉不像Apple正在处理这个问题,因为当它转换到全屏时它应该调用ViewWillDisappear。但是,因为我不必自己打电话。这就是说,这不仅仅是调用ViewWillDisappear的问题,因为Apple显示的第一个屏幕(选择通信选项的半屏幕)如果用户在该阶段取消,则不会调用ViewWillAppear或ViewWillDisappear。如果他们没有继续前进,即使他们在接下来显示的消息显示屏幕上取消,也会调用呈现VC的ViewWillAppear,而ViewWillDisappear从未被调用过。因此,要保持对ViewWillAppear和ViewWillDisappear的调用相等(我有不想要多次注册的NSNotification对象)我使用下面的代码。

[self viewWillDisappear:YES];

    UIActivityViewController *activityController = [[UIActivityViewController alloc]initWithActivityItems:shareAray
                                                                                    applicationActivities:nil];

    [self presentViewController:activityController
                       animated:YES completion:nil];

    [activityController setCompletionHandler:^(NSString *activityType, BOOL completed){
        if (!activityType || UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
        {
            [self viewWillAppear:YES];
        }
    }];

作为解释,如果用户取消第一个小半屏,则上面的activityType将为NULL。如果它们移动到下一个屏幕(即全屏),它将包含activityType,即使它们取消。因此,如果他们在第一个小半屏上取消,我必须强制调用viewWillAppear,否则常规进程将自动调用viewWillAppear。

答案 2 :(得分:0)

您是否保留对活动控制器的强引用?也许它会被释放。尝试在类中声明控制器。