我发现对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
,除非他们继续实际的全屏共享?
答案 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)
您是否保留对活动控制器的强引用?也许它会被释放。尝试在类中声明控制器。