WebView的使用
使用UIWebView可以實(shí)現(xiàn)一個(gè)內(nèi)置的瀏覽器,而且可以直接將這個(gè)瀏覽器內(nèi)嵌到應(yīng)用的任意位置
UIWebView直接集成了UIView,一般不可以與用戶交互
獲取UIWebView對(duì)象后,可配置如下常用屬性和方法
@property(nonatomic) BOOL scalesPageToFit;//該屬性控制是否縮放網(wǎng)頁以適應(yīng)該控件
@property(nonatomic) UIDataDetectorTypes dataDetectorTypes NS_AVAILABLE_IOS(3_0);//該屬性支持以下枚舉
- UIDataDetectorTypePhoneNumber //自動(dòng)檢測(cè)網(wǎng)頁上的電話號(hào)碼,點(diǎn)擊會(huì)撥號(hào)
- UIDataDetectorTypeLink //自動(dòng)檢測(cè)網(wǎng)頁上的超級(jí)鏈接
- UIDataDetectorTypeAddress //自動(dòng)檢測(cè)網(wǎng)頁上的地址
- UIDataDetectorTypeCalendarEvent //自動(dòng)檢測(cè)網(wǎng)頁上的日歷事件
- UIDataDetectorTypeNone //不檢測(cè)網(wǎng)頁上的任何內(nèi)容
- UIDataDetectorTypeAll //自動(dòng)檢測(cè)網(wǎng)頁上所有特殊內(nèi)容
- (void)loadRequest:(NSURLRequest *)request;//加載顯示URL網(wǎng)頁請(qǐng)求
- (void)loadHTMLString:(NSString *)string baseURL:(nullable NSURL *)baseURL;//加載HTML
@property (nullable, nonatomic, readonly, strong) NSURLRequest *request;//URL請(qǐng)求
- (void)reload;//重新加載
- (void)stopLoading; //停止加載
- (void)goBack; //網(wǎng)頁后退
- (void)goForward; //網(wǎng)頁前進(jìn)
-
當(dāng)UIWebView加載網(wǎng)頁時(shí),程序可為UIWebView設(shè)置一個(gè)delegate委托,該委托必須實(shí)現(xiàn)<UIWebViewDelegate>協(xié)議,該協(xié)議包括如下方法:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;//當(dāng)UIWebView將要加載指定的URL請(qǐng)求時(shí),激發(fā)該方法
- (void)webViewDidStartLoad:(UIWebView *)webView;//當(dāng)開始加載時(shí)激發(fā)
- (void)webViewDidFinishLoad:(UIWebView *)webView;//當(dāng)完成加載時(shí)激發(fā)
- (void)webView:(UIWebView *)webView didFailLoadWithError:(nullable NSError *)error;//當(dāng)加載錯(cuò)誤時(shí)激發(fā)
通過下面實(shí)例代碼來實(shí)現(xiàn)一個(gè) 迷你瀏覽器
@interface ViewController () <UIWebViewDelegate>
@property (weak, nonatomic) IBOutlet UIWebView *webView;
@property (weak, nonatomic) IBOutlet UITextField*addressBar;
@end
@implementationViewController{
UIActivityIndicatorView *_activityIndizator;
}
- (void)viewDidLoad {
[super viewDidLoad];
//設(shè)置自動(dòng)縮放網(wǎng)頁以適應(yīng)該控件
self.webView.scalesPageToFit = YES;
//為該控件設(shè)置委托
//因?yàn)槭褂迷摽刂破鲗?duì)象作為UIWebView控件的委托對(duì)象,所以該控制器類需要實(shí)現(xiàn)<UIWebViewDelegate>協(xié)議
self.webView.delegate = self;
//創(chuàng)建UIActivityIndicatorView控件,用來顯示網(wǎng)頁加載中
_activityIndizator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 32, 32)];
//將UIActivityIndicatorView顯示在當(dāng)前View的中央
[_activityIndizator setCenter:self.view.center];
//設(shè)置樣式
_activityIndizator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray;
//將_activityIndizator添加到View 并隱藏
[self.view addSubview:_activityIndizator];
_activityIndizator.hidden = YES;
}
//點(diǎn)擊前往打開網(wǎng)頁
- (IBAction)goButton:(id)sender {
[self.addressBar resignFirstResponder];
//獲取用戶輸入網(wǎng)址
NSString *addressStr = self.addressBar.text;
//如果用戶輸入的地址不包括http:// 則為用戶添加http://
if (![addressStr hasPrefix:@"http://"]) {
addressStr = [NSString stringWithFormat:@"http://%@",addressStr];
self.addressBar.text = addressStr;
}
//創(chuàng)建URL請(qǐng)求
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:addressStr]];
//加載指定URL對(duì)應(yīng)的網(wǎng)頁
[self.webView loadRequest:request];
}
//實(shí)現(xiàn)后退方法
- (IBAction)goBackButton:(id)sender {
if (self.webView.canGoBack) {
[self.webView goBack];
}
}
//實(shí)現(xiàn)<UIWebViewDelegate>協(xié)議中的方法
//當(dāng)WebView開始加載時(shí)
- (void)webViewDidStartLoad:(UIWebView *)webView{
//顯示_activityIndizator 并開始轉(zhuǎn)動(dòng)
_activityIndizator.hidden = NO;
[_activityIndizator startAnimating];
}
//當(dāng)WebView完成加載時(shí)
- (void)webViewDidFinishLoad:(UIWebView *)webView{
_activityIndizator.hidden = YES;
[_activityIndizator stopAnimating];
}
//當(dāng)WebView加載失敗時(shí)
- (void)webView:(UIWebView *)webView didFailLoadWithError:(nullable NSError *)error{
//當(dāng)加載錯(cuò)誤時(shí),用UIAlertController來顯示錯(cuò)誤信息
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"錯(cuò)誤" message:error.localizedDescription preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAlert = [UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnullaction) {
}];
[alert addAction:cancelAlert];
//顯示Alert
[self presentViewController:alert animated:YES completion:^{
_activityIndizator.hidden = YES;
[_activityIndizator stopAnimating];
}];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
最終通過代碼可實(shí)現(xiàn)如下效果

最終結(jié)果
如果出現(xiàn)下面這個(gè)提示框 則說明網(wǎng)頁加載失敗

提示
錯(cuò)誤原因是因?yàn)?默認(rèn)在iOS9 后,蘋果將原h(huán)ttp協(xié)議改成了https協(xié)議,使用 TLS1.2 SSL加密請(qǐng)求數(shù)據(jù)。我們只需要為Info.plist如下字段即可