我有适用于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>
答案 0 :(得分:2)
我在你正在使用的代码上看到了一些设计问题,但让我们开始描述崩溃。
崩溃问题非常明显:在这种情况下,您所拥有的rootViewController
不是您期望的CDVViewController
,而是_UIAlertShimPresentingViewController
(这是一个新的iOS 8上用于显示警报视图的类。
所以它发生的是你没有得到你在iOS 8上预期的rootController
,这可能是由于你如何设置rootViewController
或仅仅因为{{1不是你期望的窗口(我需要更多的日志来查看到底发生了什么)。因此,在不具有该公共属性的控制器的控制器上调用keyWindow
属性会导致崩溃。
要解决此问题,您可能希望以更好的方式设计代码。 你想要实现的是刷新CDVViewController上的webView,这里有一些可能的方法:
控制器本身可以处理此更新,而不依赖于外部对象。如果这个解决方案适合您的用例,您应该直接在控制器上触发更新,这很容易实现。
但是,在某些情况下,您可能希望在外部管理此更新,在这种情况下,请从另一个名为webView
的对象说明,当您要更新页面时,应该从{{ {1}},以便您的控制器可以观察到相应的通知。如果您不习惯通知,则可以阅读更多here。类似地,您可以使用委托模式(您可以阅读更多关于它here)来在应该触发刷新时进行通信。
或者,“快速而肮脏”的解决方法是向该外部对象提供对控制器的引用,这样您就不需要依赖窗口对象来获取您正在查找的控制器对于。
像UpdateManager
之类的东西
您可能想要创建一个外部公共方法(可能是UpdateManager
而不是公开调用方法的_updateManager.controller = myController;
)。
编辑:既然看起来你需要更多的帮助,我会在这里总结一下“快速而肮脏”的解决方法。
triggerReload
webView
的媒体资源
CDVViewController *webViewController
时,请设置此属性,例如
SessionManager
CDVViewController
的{{1}}方法,您可以使用属性CDVViewController *myViewController = [[CDVViewController alloc] initWithNibName:@"CDVViewController bundle:nil];
[SessionManager sharedInstance].webViewController = myViewController;
,而不是依赖reload