为什么我的应用程序内浏览器没有加载?

时间:2011-06-01 09:11:06

标签: iphone objective-c xcode ios

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

我的架构看起来像这样: UIViewController的子类:uiviewcon 从它的笔尖加载:

  • 的UIWebView
  • 顶部和底部栏,带有向前,向后等的UI元素......

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

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

webview是我的笔尖中的UIWebView的IBOutlet。然而,似乎webView是nil(我通过if(webView)检查...,并且我已经明确地将它连接到IB)

我的webView未分配的可能原因是什么?我已经在uiviewcon中实现了UIWebViewDelegate协议的一些方法(在uiviewcon的viewDidLoad中将self设置为delegate),但是这些方法都没有被调用(因为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

2 个答案:

答案 0 :(得分:3)

只有在需要时才会实例化您的视图元素。这意味着对控制器的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]之类的内容也会如此。就像我说的那样,没关系。

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

答案 1 :(得分:1)

您是否已将UIWebView小部件连接到Interface Builder窗口中的webView插座?如果没有看到this page如何做到这一点。

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