【问题标题】:Why is my In-App Browser not loading?为什么我的应用内浏览器没有加载?
【发布时间】:2011-09-06 03:02:56
【问题描述】:

我想创建一个自定义应用内浏览器以在我的应用内显示它。

我的架构如下所示: UIViewController 的子类:uiviewcon 从它的笔尖加载:

  • UIWeb 视图
  • 带有 UI 元素的顶部和底部栏,例如向前、向后、...

实例化 uiviewcon 后,我在其上调用以下方法:

-(void)loadrequest:(NSURLRequest *)urlrequest{
    [webView loadRequest:urlrequest];
}

webview 是我笔尖中 UIWebView 的 IBOutlet。但是似乎 webView 是 nil (我通过 if(webView)... 进行了检查,并且我肯定在 IB 中连接了它)

我的 webView 没有被分配的可能原因是什么?我也在 uiviewcon 中实现了 UIWebViewDelegate 协议的一些方法(在 uiviewcon 的 viewDidLoad 中将 self 设置为委托),但这些方法都没有被调用(似乎合理,因为 webView 为 nil)。

如何改进我的代码,以便我的浏览器最终加载一些内容?

编辑:我的 uiviewcon 标题:

@protocol CustomWebViewDelegate
-(void)hidecustomwebview;
@end

@interface CustomWebView : UIViewController<UIWebViewDelegate> {
    UIActivityIndicatorView *spinner;
    UIWebView *webView;
}
@property (nonatomic, retain) IBOutlet UIActivityIndicatorView *spinner;
@property (nonatomic, retain) IBOutlet UIWebView *webView;
@property (nonatomic,assign) id <CustomWebViewDelegate>delegate;
-(void)webViewDidStartLoad:(UIWebView *)webView;
-(void)webViewDidFinishLoad:(UIWebView *)webView;
-(void)loadrequest:(NSURLRequest *) urlrequest;
-(IBAction)hideme;
@end

【问题讨论】:

    标签: iphone objective-c xcode ios


    【解决方案1】:

    您的视图元素仅在需要时才被实例化。这意味着对控制器的view 属性的第一次引用(内部来自UIKit 或代码中任何地方对'self.view' 的引用)会触发实际创建您在笔尖中拥有的所有元素的过程。

    所以在上述过程发生之前,您的webView 属性将为零。您很可能在实例化视图之前调用了loadRequest。您的问题的解决方案是在调用 loadRequest 时进行更改。

    那么调用 loadRequest 的正确时间是什么时候?有三种可能:

    1) 如果您从 CustomWebView 内部调用 loadRequest,您可以将该代码放入 viewDidLoad

    2) 如果您必须从 CustomWebView 外部调用 loadRequest,您可以等待第一次显示该控制器(例如使用 presentModalViewController:animated: 或将控制器推送到导航堆栈),然后调用 loadRequest。

    所以你的代码可能看起来像:

    NSURLRequest *someRequest = nil; //Assume this has some valid value
    
    CustomWebView *myWebView = [[CustomWebView alloc] init]; //Plus other nib niceties
    [self presentModalViewController:myWebView];
    [myWebView loadRequest:someRequest];                     //View has been created, 
                                                             //loadRequest will work.
    

    而不是原来的样子:

    NSURLRequest *someRequest = nil; //Assume this has some valid value
    
    CustomWebView *myWebView = [[CustomWebView alloc] init]; //Plus other nib niceties
    [myWebView loadRequest:someRequest];                     //Your view is not created yet, loadRequest won't work.
    [self presentModalViewController:myWebView];             
    

    3) 如果您不能执行上述操作,并且无论您何时选择presentModalViewControllerpushViewController,都必须能够在任何时间点调用 loadRequest,那么总有一个技巧可以挽救这一天 :)

    技巧在于,只需在 CustomWebView 的 init 方法中引用 self.view,您就可以确信在“init”之后立即设置了视图。不管你如何引用self.view,甚至像[self.view setNeedsLayout] 这样的东西都可以。就像我说的,没关系。

    这是一个相当简单的问题,但我想在这里列出所有选项,因为这是我过去常犯的一个相当常见的错误。

    【讨论】:

      【解决方案2】:

      您是否已将 UIWebView 小部件连接到 Interface Builder 窗口中的 webView 插座?如果没有,请参阅this page 了解如何操作。

      在调用loadRequest 方法时也应该小心。一个安全的地方是viewDidLoad 方法,您可以保证连接 IBOutlet。

      【讨论】:

      • 我从未听说过 IB 中有一个叫做“widget”的东西。但是,我已将 UIWebView 从我的笔尖连接到我的 uiviewcon 的 IBOutlet。这回答了你的问题了吗?我对我必须承认的小部件一词有点困惑:P 感谢您的回答! :)
      • 是的,我就是这个意思。你什么时候调用'loadrequest'方法?
      • alloc 初始化后立即。嗯,从你所说的看来,这似乎是错误的。你会如何建议我告诉我的 uiviewcon 告诉 webView 加载某个 NSURLRequest?
      • 最好的地方是'CustomWebView'类的'viewDidLoad'方法。
      猜你喜欢
      • 2019-12-26
      • 2018-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-20
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      相关资源
      最近更新 更多