我想创建一个自定义的应用内浏览器,以便在我的应用内显示它。
我的架构看起来像这样: UIViewController的子类:uiviewcon 从它的笔尖加载:
在我实例化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
答案 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)如果您无法执行上述操作,并且无论何时选择presentModalViewController
或pushViewController
,都必须能够在任何时间调用loadRequest,总会有一个黑客可以保存那天:)
黑客攻击,只需在CustomWebView的init方法中引用self.view
,您就可以确信视图已经在'init'之后立即设置。无论您如何引用self.view
,即使[self.view setNeedsLayout]
之类的内容也会如此。就像我说的那样,没关系。
这是一个相当简单的问题,但我想在这里列出所有选项,因为这是我过去经常犯的错误。
答案 1 :(得分:1)
您是否已将UIWebView小部件连接到Interface Builder窗口中的webView插座?如果没有看到this page如何做到这一点。
您在调用loadRequest
方法时也应该小心。一个安全的地方是viewDidLoad
方法,保证IBOutlet有线。