1.UIWebView
UIWebView不僅能加載網絡資源還可以加載本地資源,目前支持的常用的文檔格式如:html、pdf、docx、txt等。
UIWebView整個使用相當簡單:創建URL->創建請求->加載請求,無論是加載本地文件還是Web內容都是這三個步驟。UIWebView內容加載事件同樣是通過代理通知外界,常用的代理方法如開始加載、加載完成、加載出錯等,這些方法通常可以幫助開發者更好的控制請求加載過程。
加載資源:
- (void)loadRequest:(NSURLRequest *)request;
常用的屬性和方法:
//重新加載(刷新)
- (void)reload;
//停?止加載
- (void)stopLoading;
//回退
- (void)goBack;
//前進
- (void)goForward;
//需要進?檢測的數據類型
@property(nonatomic) UIDataDetectorTypes dataDetectorTypes
//是否能回退
@property(nonatomic,readonly,getter=canGoBack) BOOL canGoBack;
//是否能前進
@property(nonatomic,readonly,getter=canGoForward) BOOL canGoForward;
//是否正在加載中
@property(nonatomic,readonly,getter=isLoading) BOOL loading;
//是否伸縮內容至適應屏幕當前尺寸
@property(nonatomic) BOOL scalesPageToFit;
遵守UIWebViewDelegate協議,監聽UIWebView的加載過程:
//開始發送請求(加載數據)時調用:
- (void)webViewDidStartLoad:(UIWebView *)webView;
//請求完畢(加載數據完畢)時調?:
- (void)webViewDidFinishLoad:(UIWebView *)webView;
//請求錯誤時調用:
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;
//監聽UIWebView的加載過程:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
下面是一個例子:
在storyBoard中拖入如下控件:
searchBar的代理方法:
-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{
[self request:_searchBar.text];
[searchBar resignFirstResponder];
}
加載searchBar中的請求:
-(void)request:(NSString *)urlStr{
//創建url
NSURL *url;
//如果file://開頭的字符串則加載bundle中的文件
if([urlStr hasPrefix:kFILEPROTOCOL]){
//取得文件名
NSRange range= [urlStr rangeOfString:kFILEPROTOCOL];
NSString *fileName=[urlStr substringFromIndex:range.length];
url=[[NSBundle mainBundle] URLForResource:fileName withExtension:nil];
}else if(urlStr.length>0){
//如果是http請求則直接打開網站
if ([urlStr hasPrefix:@"http"]) {
url=[NSURL URLWithString:urlStr];
}else{//如果不符合任何協議則進行搜索
urlStr=[NSString stringWithFormat:@"http://m.bing.com/search?q=%@",urlStr];
}
urlStr=[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];//url編碼
url=[NSURL URLWithString:urlStr];
}
//創建請求
NSURLRequest *request=[NSURLRequest requestWithURL:url];
//加載請求頁面
[_webView loadRequest:request];
}
WebView的代理方法:
-(void)webViewDidStartLoad:(UIWebView *)webView{
//顯示網絡請求加載
[UIApplication sharedApplication].networkActivityIndicatorVisible=true;
}
-(void)webViewDidFinishLoad:(UIWebView *)webView{
//隱藏網絡請求加載圖標
[UIApplication sharedApplication].networkActivityIndicatorVisible=false;
//設置按鈕狀態
[self setBarButtonStatus];
}
-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{
NSLog(@"error detail:%@",error.localizedDescription);
UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"系統提示" message:@"網絡連接發生錯誤!" delegate:self cancelButtonTitle:nil otherButtonTitles:@"確定", nil];
[alert show];
}
設置前進后退按鈕:
-(void)setBarButtonStatus{
if (_webView.canGoBack) {
_barButtonBack.enabled=YES;
}else{
_barButtonBack.enabled=NO;
}
if(_webView.canGoForward){
_barButtonForward.enabled=YES;
}else{
_barButtonForward.enabled=NO;
}
}
運行結果如下:
你可以在這里下載到代碼。
- (void)getAccessToken:(NSString *)requestToken
{
[HttpTool postWithPath:@"oauth2/access_token" params:@{
@"client_id" : kAppKey,
@"client_secret" : kAppSecret,
@"grant_type" : @"authorization_code",
@"redirect_uri" : kRedirectURI,
@"code" : requestToken
} success:^(id JSON) {
// 保存賬號信息
Account *account = [[Account alloc] init];
account.accessToken = JSON[@"access_token"];
account.uid = JSON[@"uid"];
[[AccountTool sharedAccountTool] saveAccount:account];
// 回到主頁面
ViewController *main = [[ViewController alloc]init];
if (main) {
[self presentViewController:main animated:YES completion:nil];
}
} failure:^(NSError *error) {
}];
}