我发现对UIActivityViewController的调用并不是在调用ViewWillDisappear,但是当用户从VC返回时,它确实调用了ViewWillAppear。这个过程是两个步骤,因为在一开始,它会弹出一半的屏幕,允许用户选择文本或电子邮件之类的东西。取消这里返回到调用VC,没有调用ViewWillAppear。这很好。但是,如果您选择像text这样的通信选项,则VC将被一个不调用ViewWillDisappear的全屏文本VC所取代。
但是,我可以手动调用ViewWillDisappear,这样我就不知道用户是否在整个屏幕转换之前在较小的半屏幕上选择“取消”。
调用ActivityVC的代码如下所示:
UIActivityViewController *activityController = [[UIActivityViewController alloc]initWithActivityItems:shareAray
applicationActivities:nil];
[self presentViewController:activityController
animated:YES completion:nil];返回时不调用ViewWillDisappear的任何原因都会调用ViewWillAppear吗?无论如何,要知道用户是否在前面的较小的半屏幕上点击“取消”,这样我就不会亲自调用ViewWillDisappear,除非他们继续使用实际的全屏共享?
发布于 2014-09-05 21:15:23
正如Gutblender通过上面的交换所表明的那样,UIActivityVC并没有因为ViewWillDisappear而调用modalPresentationStyle。苹果似乎并没有正确处理这个问题,因为当它转变为全屏时,它应该调用ViewWillDisappear。不过,既然没有,我只好自己管它了。这就是说,这不仅仅是打电话给ViewWillDisappear的问题,因为如果用户在那个阶段取消,苹果的第一个屏幕(选择通信选项的半屏幕)不会调用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。
发布于 2014-09-05 20:32:43
presentViewController方法将导致在呈现的视图控制器上调用viewWillAppear:,然后在呈现的视图控制器即将消失时调用viewWillDisappear:。要拦截这些调用,子类UIActivityViewController并实现对这些方法的重写。
至于如何判断用户是否取消了,我建议您按照Windows窗体常用的方式来做。添加某种类型的公共“对话框结果”属性(可能公开为get-only),该属性设置为某个值范围之一,这样调用(或呈现)视图控制器可以知道为什么调用(在本例中为self.presentedViewController )被取消。
发布于 2014-09-05 21:18:07
是否保留对活动控制器的强烈引用?也许它要被释放了。尝试在类中声明控制器。
https://stackoverflow.com/questions/25691723
复制相似问题