我们首先先看代码:
UIDocumentInteractionController *documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:[ZQLog getLogFilePath]]];
self.documentInteractionController = documentInteractionController ;
documentInteractionController.delegate = self;
//直接显示预览界面
[documentInteractionController presentPreviewAnimated:YES];
}
#pragma mark - UIDocumentInteractionControllerDelegate
//在哪个控制器显示预览界面
-(UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller
{
return [UIApplication sharedApplication].keyWindow.rootViewController;
}
在网上搜索,发现UIDocumentInteractionController不起作用大部分是初学者使用局部变量来实现,忘了持有对象。但我这是对的,而且在IPAD升级到14.4前是好的,升级后突然不行了。
当我查看UIDocumentInteractionController的说明文档,发现其是通过代理中的ViewController打开文档的,于是就怀疑是不是代理中的ViewController不对了,于是我稍微修改了下代码并进行调试。发现如下:


发现没有,UIDocumentInteractionController代理这里的获取的rootViewController并不是我们设置的rootViewController,而且这里的rootViewController是一个无意义的UIViewController,正常有意义的情况下应该是显示UIViewController的子类对象。
于是我把代理中的代码改为:
//在哪个控制器显示预览界面
-(UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller
{
AppDelegate *delegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
if(delegate.rootViewController){
return delegate.rootViewController;
}
return [UIApplication sharedApplication].keyWindow.rootViewController;
}
发现果然OK了。
至于rootViewController为啥会变掉,个人没有怎么去研究过这部分源代码,如果有高手知道,请在回复中告知!
在升级到iOS 14.4后,使用UIDocumentInteractionController预览文件出现问题。经过排查,发现UIDocumentInteractionController的代理中的rootViewController变成了无意义的对象,而非预期的UIViewController子类。通过修改代理代码,设置正确的rootViewController,问题得到解决。对于rootViewController为何会改变的原因,目前未知。
2373

被折叠的 条评论
为什么被折叠?



