在iOS7上工作后,iOS 8上的webView重新加载出错

时间:2014-09-21 09:05:11

标签: ios iphone webview ios8

我有适用于iOS的iPhone应用程序< 7好,在升级到iOS 8后,我的应用程序在下一个错误时崩溃:

我正在使用webView显示我的应用程序的大部分内容,经过一些更改后我检查是否通过X分钟,如果否我不做任何事情并继续显示当前页面,但如果是,我做的是从头开始启动它开始:

 UIWindow *window = [UIApplication sharedApplication].keyWindow;

    CDVViewController *rootViewController = (CDVViewController *)window.rootViewController;

    [rootViewController.webView reload]; 

reload我遇到崩溃+错误:

-[_UIAlertShimPresentingViewController webView]: unrecognized selector sent to instance 0x17de2800

2014-09-21 11:56:43.719 myapp4[803:191017] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_UIAlertShimPresentingViewController webView]: unrecognized selector sent to instance 0x17de2800'

任何想法可能是什么问题?

增加:

重新加载webView我正在调用来自SessionManager的{​​{1}}对象中的方法,这应该是作业:

AppDelegate

AppDelegate.m [SessionManager reload] 中,该方法正在完成我在乞讨中所写的所有内容。

我尝试从SessionManager输入对webView的来电,但它确实有效:

AppDelegate

但我不想在[viewController.webView reload] 更改会话逻辑并且更喜欢在AppDelegate上进行更改...我仍然可以从SessionManager类调用吗?< / p>

1 个答案:

答案 0 :(得分:2)

我在你正在使用的代码上看到了一些设计问题,但让我们开始描述崩溃。

崩溃问题非常明显:在这种情况下,您所拥有的rootViewController不是您期望的CDVViewController,而是_UIAlertShimPresentingViewController(这是一个新的iOS 8上用于显示警报视图的类。

所以它发生的是你没有得到你在iOS 8上预期的rootController,这可能是由于你如何设置rootViewController或仅仅因为{{1不是你期望的窗口(我需要更多的日志来查看到底发生了什么)。因此,在不具有该公共属性的控制器的控制器上调用keyWindow属性会导致崩溃。

要解决此问题,您可能希望以更好的方式设计代码。 你想要实现的是刷新CDVViewController上的webView,这里有一些可能的方法:

  • 控制器本身可以处理此更新,而不依赖于外部对象。如果这个解决方案适合您的用例,您应该直接在控制器上触发更新,这很容易实现。

  • 但是,在某些情况下,您可能希望在外部管理此更新,在这种情况下,请从另一个名为webView的对象说明,当您要更新页面时,应该从{{ {1}},以便您的控制器可以观察到相应的通知。如果您不习惯通知,则可以阅读更多here。类似地,您可以使用委托模式(您可以阅读更多关于它here)来在应该触发刷新时进行通信。

  • 或者,“快速而肮脏”的解决方法是向该外部对象提供对控制器的引用,这样您就不需要依赖窗口对象来获取您正在查找的控制器对于。 像UpdateManager之类的东西 您可能想要创建一个外部公共方法(可能是UpdateManager而不是公开调用方法的_updateManager.controller = myController;)。

编辑:既然看起来你需要更多的帮助,我会在这里总结一下“快速而肮脏”的解决方法。

  1. triggerReload
  2. 上创建名为webView的媒体资源
  3. 初始化CDVViewController *webViewController时,请设置此属性,例如 SessionManager
  4. 现在使用CDVViewController的{​​{1}}方法,您可以使用属性CDVViewController *myViewController = [[CDVViewController alloc] initWithNibName:@"CDVViewController bundle:nil]; [SessionManager sharedInstance].webViewController = myViewController;,而不是依赖reload