【问题标题】:UIWebView throwing exception on LoadRequestUIWebView 在 LoadRequest 上抛出异常
【发布时间】:2013-05-02 01:57:14
【问题描述】:

我有以下代码试图在我的应用上加载网页:

Console.WriteLine("login view class");
NSUrl url = new NSUrl("http://deekor.com");
NSUrlRequest request = new NSUrlRequest(url);
loginWebView.LoadRequest(request);

最后一行:

loginWebView.LoadRequest(request);

正在引发System.Reflection.TargetInvocationException 异常。

loginWebViewUIWebView

怎么了?

编辑

我想我忘记了这一行:loginWebView = new UIWebView(); 添加它后异常消失了......但是页面没有加载......

查看调试中的本地变量,我看到 loginWebView 在调用 loginWebView = new UIWebView(); 之前设置为 null。我是想创建这样一个新的,还是我的插座有问题?

LoginViewController.Designer.cs

故事板

【问题讨论】:

  • 不确定,但TargetInvocationException表示在反射过程中,调用方法时出现异常。内部异常将提供错误的真实细节。
  • @KirkWoll 我刚刚编辑了我的帖子。这看起来对吗?知道为什么它现在没有加载吗?
  • 您是否将 loginWebView 添加到其父级以使其可见?
  • @Jason 我将一个 uiwebview 拖到情节提要上,并为它创建了一个名为 loginWebView 的出口,如果这就是您的要求。抱歉,我对此很陌生。
  • @Jason 我进一步更新了我的帖子

标签: c# xamarin.ios xamarin


【解决方案1】:

@Deekor,

我加载了一个新项目,并尝试完全按照您的要求制作。如果我按照以下步骤操作,我会遇到同样的问题:

  1. 创建一个新的 iPhone、单一视图、情节提要项目。
  2. 打开故事板文件并将 UIWebView 拖到新项目中自动创建的 UIViewController 上。
  3. 返回 Xamarin Studio 并在为我创建的 LoginViewController.cs 文件中,尝试放入 loginWebView.Request 代码。

这不起作用,正如您所注意到的,因为 Web 视图为空。不应该。我不知道为什么,但是自动创建的 LoginViewController.cs 文件中也缺少方法。我无法覆盖您想要的 ViewDidLoad()。即使该类是从 UIViewController 继承的,覆盖也是不可用的。所以这是我解决问题的方法:

  1. 删除 Storyboard 中自动生成的 UIViewController。
  2. 删除自带的自动生成类(LoginViewController.cs)
  3. 现在在情节提要中,拖入一个新的 UIViewController。
  4. 在界面生成器的自定义类框中,输入您的类名:LoginViewController。
  5. 返回 Xamarin Studio,让它同步并再次为您创建文件。
  6. 不要返回 Interface Builder/Xcode 并将 UIWebView 拖到您在第 3 步中创建的新 LoginViewController 上。
  7. 像以前一样拖动 loginWebView 的出口。
  8. 返回 Xamarin Studio 并让它同步。
  9. 打开您的 LoginViewController.cs 文件,现在您可以覆盖 ViewDidLoad()。
  10. 现在你可以简单地拥有这个:

    public partial class LoginViewController : UIViewController
    {
        public LoginViewController (IntPtr handle) : base (handle)
        {
        }
    
        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();
    
            loginWebView.LoadRequest(new NSUrlRequest(new NSUrl("http://deekor.com")));
        }
    }
    

我不知道为什么有时新项目中自动生成的文件表现得很奇怪,但基本上我所做的只是删除它创建的内容,然后再次手动添加相同的内容,然后它就可以工作了。启动时 Web 视图为空,这让我觉得有问题。如果有什么令人困惑的地方,请发表评论,如果可以的话,我会尽力解释得更好。我确实按照上述步骤完成了这项工作。在附加的图像中,您可以看到它在模拟器中运行,显示您的页面。

【讨论】:

  • 啊哈!我的控制器是按照您在自动生成后建议的那样创建的。但是我只是注意到类头生成为public partial class LoginViewController : UIView 而不是public partial class LoginViewController : UIViewController 更改它已修复!
【解决方案2】:

只是想看看发生了什么,请尝试以下操作:

Console.WriteLine("login view class");
var webView = new UIWebView(this.View.Frame);
this.View.Add(webView);
NSUrl url = new NSUrl("http://deekor.com"); 
NSUrlRequest request = new NSUrlRequest(url);
webView.LoadRequest(request);

如果可行,则意味着 WebView 如何添加到您的 Storyboard 然后作为插座连接存在问题...

【讨论】:

  • 不,仍然没有加载页面。我已经用我的出口截图更新了我的问题。
  • 你在多台开发机器上试过这个吗?模拟器肯定可以上网吗?我在上面尝试了我的代码,它运行良好。
  • 我没有尝试过其他机器,但它肯定有interent access,我在代码的其他部分做一个httprequest就好了。我的插座在上面的屏幕截图中看起来正确吗?
  • 是的,它看起来不错,您的插座不太可能,因为我添加的上述代码不起作用。
  • 我认为它是插座的唯一原因是因为loginWebView 在我调用new UIWebView(); 之前被设置为null,它不应该已经设置为对象的实例吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 2013-05-24
  • 2011-05-25
  • 2015-08-03
相关资源
最近更新 更多