应用程序从 iOS 中的电子邮件附件启动时的顺序
Posted
技术标签:
【中文标题】应用程序从 iOS 中的电子邮件附件启动时的顺序【英文标题】:Sequence when application launches from email attachment in iOS 【发布时间】:2012-06-24 20:49:14 【问题描述】:在我的应用程序中,一个 viewController 管理一个 UIWebView。是使用应用程序的主故事板创建的。此应用能够打开 rtf 电子邮件附件并将其显示到其 UIWebView。
当应用程序在后台时,一切正常。应用程序委托方法
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
被调用并且有一个方法
[viewController loadImportedRTFDocument:url];
被调用。控制器加载文档并显示它。
当用户在邮件应用程序中选择附件时应用程序不在后台时,它会正确启动。调用 App 委托 openURL,viewController 接收到加载导入文档的消息。但它无法显示它,因为 UIWebView 尚未分配(返回 nil 指针)。
我观察到的是,应用委托调用的方法是在控制器收到 viewDidLoad 消息之前生成的......
在这种情况下如何确定 viewController 已正确初始化,我应该在哪里要求 UIWebView 加载与 rtf 附件关联的 NSData 对象?
【问题讨论】:
你是要使用同一个viewController来显示所有的文档还是要为每个文档重新分配? 是的,为了节省内存,只有一个viewController处理一个UIWebView。控制器在必要时在视图中加载文档 html 内容。该视图应该在加载描述主视图界面的故事板文件时进行分配初始化。 【参考方案1】:您可以使用NSObject
的 performSelector 在运行循环结束时调用loadImportedRTFDocument
(即在应用程序完全加载并处于空闲状态之后):
// Will be called after app has loaded
[viewController performSelector:@selector(loadImportedRTFDocument:) withObject:url afterDelay:0];
【讨论】:
对不起,我可能是个白痴,我不明白你的意思......我试过了,但不成功......没有效果 您是否将[viewController loadImportedRTFDocument:url
替换为[viewController performSelector:@selector(loadImportedRTFDocument:) withObject:url afterDelay:0];
?如果你这样做了,你能检查一下 viewController 是否不是 nil...
viewController 永远不会是零。这是它的 UIWebView 属性,在任何经过测试的情况下都返回 nil,包括你描述的那个......我不能在这里进一步讨论,因为解决方案应该依赖于 ios 6,并且在其正式发布之前有一个 NDA。跨度>
你用什么方法初始化你的网页视图?还是用笔尖完成的?
好的,我对故事板没有任何经验,但是使用 nib,您需要将视图链接到属性...您是否将编辑器中的 UIWebView
链接到您班级的 webView 属性? (假设故事板的工作方式与界面构建器相同......)【参考方案2】:
所以loadImportedRTFDocument
在视图加载之前被调用。要解决它,请存储URL
,然后在viewDidLoad
将其加载到网络视图中。为避免应用程序在后台时重复加载,请在loadImportedRTFDocument
处进行切换,这将仅在 webView 初始化时加载 URL。这样,webView 应该加载到viewDidLoad
或loadImportedRTFDocument
,具体取决于是否加载了视图。
此解决方案还将(如果 URL 仍然有效且资源仍然存在)使您的 webView 显示数据,即使 webView 已卸载 memoryWarning。
【讨论】:
以上是关于应用程序从 iOS 中的电子邮件附件启动时的顺序的主要内容,如果未能解决你的问题,请参考以下文章