【问题标题】:Error on webView reload on iOS 8 after was working on iOS7在 iOS7 上工作后,在 iOS 8 上重新加载 webView 时出错
【发布时间】:2014-09-21 09:05:10
【问题描述】:

我的 iPhone 应用在 iOS

我正在使用 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,我正在从AppDelegate 调用SessionManager 对象中的一个方法,这应该是为了工作:

AppDelegate.m
[SessionManager reload]

SessionManager 中,该方法正在做我在乞讨中写的所有内容。

我尝试从AppDelegate 输入对webView 的呼叫,它成功了:

[viewController.webView reload]

但我不想对AppDelegate 中的会话逻辑进行太多更改,而是更喜欢在SessionManager 上进行更改...我还能从SessionManager 类中调用它吗?

【问题讨论】:

    标签: ios iphone webview ios8


    【解决方案1】:

    我发现您正在使用的代码存在一些设计问题,但是让我们开始描述崩溃。

    从崩溃中问题很明显:在这种情况下,您拥有的 rootViewController 不是您所期望的 CDVViewController,而是 _UIAlertShimPresentingViewController(它是 iOS 8 上用于显示警报视图)。

    所以发生的情况是您在 iOS 8 上没有得到您所期望的 rootController,这可能是由于您如何设置 rootViewController 或仅仅因为使用 keyWindow 检索的窗口不是窗口您期望(我需要更多日志才能确切了解发生了什么)。因此,使用该公共属性在不是您的控制器的控制器上调用 webView 属性会导致崩溃。

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

    • 控制器可以自行处理此更新,而无需依赖外部对象。如果此解决方案适合您的用例,您应该直接在控制器上触发更新,非常容易实现。

    • 1234563 ,以便您的控制器可以观察到该通知的相应反应。如果你不习惯通知,可以阅读更多here。同样,您可以使用委托模式(您可以阅读有关它的更多信息here)在应该触发刷新时进行通信。
    • 另外一种“快速而肮脏”的解决方法是向这个外部对象提供对控制器的引用,这样您就不需要依赖窗口对象来获取您正在查找的控制器为了。 类似_updateManager.controller = myController; 并且您可能想要创建一个外部公共方法(可能是 triggerReload 而不是公开 webView 调用它的方法)。

    编辑:由于您似乎需要更多帮助,因此我将在此处总结“快速而肮脏”的解决方法的步骤。

    1. 在您的SessionManager 上创建一个名为CDVViewController *webViewController 的属性
    2. 当你初始化CDVViewController时,设置这个属性,比如 CDVViewController *myViewController = [[CDVViewController alloc] initWithNibName:@"CDVViewController bundle:nil]; [SessionManager sharedInstance].webViewController = myViewController;
    3. 现在在SessionManagerreload 方法上,您可以使用属性webViewController 而不是依赖[UIApplication sharedApplication].keyWindow.rootViewController

    【讨论】:

    • 好吧,我在webView 之上显示UIAlertView,而在iOS8 之前,我使用该代码并获得CDVViewController,现在我知道我获得了@ 987654346@。你能告诉我如何在不改变所有项目设计的情况下修复它吗?因为当我在没有UIAlertView 的情况下调用此方法时,它可以正常工作,
    • 也许我在更改(CDVViewController *)window.rootViewController; 后无法获得CDVViewController。您还需要哪些日志来帮助回答这个问题?
    • 我回答的最后一句基本描述了快速而肮脏的解决方法,您需要给触发更新的对象一个对您的控制器的引用。这个对象是谁?是appDelegate吗?如果是这样,您应该参考CDVViewController,只需将其保存在属性中以备后用
    • 我在原始问题中添加了一些数据来回答您的评论
    • 我已经向你解释了确切的解决方法,我只是再次编辑了几个步骤来澄清更多。
    猜你喜欢
    • 2014-12-02
    • 2020-12-30
    • 1970-01-01
    • 2020-01-06
    • 1970-01-01
    • 2014-10-08
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多