利用KVO设置网页的一些属性

@WilliamAlex大叔的微博一起学习iOS

思路: 以前访问网页的控件功能相对来说有个缺点: 有的有返回,前进或者是监听进度的进度条,但是必须要借助其它应用才能打开,也有在当前应用就能打开网页的,但是,却没有上述的一些功能.以下介绍两种方法来介绍如何打开一个网页.
  • 1, SFSafariViewController(只能在iOS9或者更高的版本使用)

SFSafariViewController展示网页:1.webView 2.openUrl
webView:没有自带功能,好处,就在当前应用下展示网页,webView不能监听进度条
safari:自带了很多功能,弊端:必须要跳转到其他应用
在当前应用下展示网页,但是有safari功能,自定义view,进度条,前进,后退,刷新功能,网址.
iOS9 SFSafariViewController:具备safari功能,并且可以在当前应用下展示网页
只能在iOS9使用

//  1.首先导入一个框架
 #import <SafariServices/SafariServices.h>
  • 2, WebKit:跟WebView,能监听进度条,iOS8以后版本才能使用.

方法一 :

// 背景介绍: 创建一个流水布局,当点击流水布局中的cell时,就跳转到对应的网页.
步骤:
1, 定义了个模型类,声明url属性
2, 导入框架: #import <SafariServices/SafariServices.h>
3, 遵守代理,并设置代理
4, 实现代理方法
  • 1,主要方法实现:
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{

   // 取出模型
   WGSquareItem *item = self.topics[indexPath.row];

   // 判断模型中的url是否是"http"
   if ([item.url hasPrefix:@"http"]) {

       // 跳转界面
       SFSafariViewController *safarVc = [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString:item.url]];

       safarVc.hidesBottomBarWhenPushed = YES;

       [self.navigationController pushViewController:safarVc animated:YES];
   }
}
  • 注意 : 需要遵守协议以及设置代理.

方法二 :

  • 思路 : 在iOS8的时候,一般都是使用UIWebView,但是需要自己设置一些功能.

    • 1, 新建一个继承自UIViewController的类,在storyboard中描述好界面,拖线监听属性
  • 2, 在.h文件中定义一个NSUrl属性,用于接收传递进来的url值.

  • 3, 在.m文件中声明一个WKWebView(需要用到进度条和title属性)

  • 实现方法如下

// 声明属性和监听对应的控件的变化
#import "WGWebViewController.h"
#import <WebKit/WebKit.h>

@interface WGWebViewController () <UIWebViewDelegate>

/** 网页 */
@property (nonatomic, weak) WKWebView *webView;
/** 监听网页占位视图 */
@property (weak, nonatomic) IBOutlet UIView *htmlView;
/** 监听返回 */
@property (weak, nonatomic) IBOutlet UIBarButtonItem *backItem;
/** 监听前进 */
@property (weak, nonatomic) IBOutlet UIBarButtonItem *forwardItem;
/** 监听进度条 */
@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
@end
  • KVO监听属性值的变化
@implementation WGWebViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self loadWebView];
}

#pragma mark - 加载网页
- (void)loadWebView {

    // 加载网页
    WKWebView *webView = [[WKWebView alloc] init];
    [self.htmlView addSubview:webView];
    self.webView = webView;

    // 加载请求
    NSURLRequest *request = [NSURLRequest requestWithURL:_url];
    [_webView loadRequest:request];

    // 前进,后退,刷新,进度条,网页信息
    // Observer;观察者
    // KeyPath:观察哪个属性
    // options:观察新值
    // KVO:监听属性
    [_webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];
    [_webView addObserver:self forKeyPath:@"goBack"            options:NSKeyValueObservingOptionNew context:nil];
    [_webView addObserver:self forKeyPath:@"title"             options:NSKeyValueObservingOptionNew context:nil];
    [_webView addObserver:self forKeyPath:@"goForward"         options:NSKeyValueObservingOptionNew context:nil];

}

  • 注意 :在创建网页时时WKWebView,不是UIWebView,不然在后面是拿不到进度条的属性值的
  • 移除KVO监听
#pragma mark - 移除KVO
- (void)dealloc
{
    [_webView removeObserver:self forKeyPath:@"title"];
    [_webView removeObserver:self forKeyPath:@"goBack"];
    [_webView removeObserver:self forKeyPath:@"goForward"];
    [_webView removeObserver:self forKeyPath:@"estimatedProgress"];

}
  • 布局创建的webView
#pragma mark - 布局
- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];
    _webView.frame = _htmlView.bounds;
}
  • 监听属性是否有新值的产生
#pragma mark - 监听是否有新值
/**
 *  只要是用KVO监听,只要有新值就会调用该方法
 */
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
    _backItem.enabled = _webView.canGoBack;
    _forwardItem.enabled = _webView.canGoForward;
    _progressView.progress = _webView.estimatedProgress;
    _progressView.hidden = _webView.estimatedProgress >= 1;
    self.title = _webView.title;
}
  • 注意 : 1, 创建加载网页的View必须是WKWebView,不能是UIWebView(容易粗心大意),否则这里是拿不到estimatedProgress属性值的. 2, 这个方法表示的意思是当使用KVO监听属性时,只要属性有新值的产生,就一定会来到这个方法.
  • 事件监听(拖线监听)
#pragma mark - 事件监听

- (IBAction)goBack:(UIBarButtonItem *)sender {
    [self.webView goBack];
}
- (IBAction)goForward:(UIBarButtonItem *)sender {
    [self.webView goForward];
}
- (IBAction)reload:(UIBarButtonItem *)sender {
    [self.webView reload];
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,010评论 4 62
  • 通过学习,你将会学习以下几个方面的内容: **什么是WKWebView以及它和UIWebView的区别是什么 **...
    SOI阅读 11,588评论 18 42
  • 1 今天我理了发,第一次在离家几百公里地方,第一次这么贵。 早上起来洗过头但没有吹风的我被室友数落了一顿,大致意思...
    春无忧阅读 289评论 3 2
  • 智能和兴趣不一定朝同一个方向发展,所以父母要用不同的角度去看孩子。为了找出孩子潜藏的智能,很多妈妈会把孩子的行程排...
    儿童智能Lessi阅读 248评论 0 0