美文网首页
KVO监听WKWebView

KVO监听WKWebView

作者: MegahertzCHN | 来源:发表于2017-01-11 11:18 被阅读2918次
#import "SLWebViewController.h"
#import <WebKit/WebKit.h>

@interface SLWebViewController ()
@property (weak, nonatomic) IBOutlet UIView *contentView;
@property (nonatomic, weak) WKWebView *webView;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *backItem;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *forwardItem;
@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
@end

@implementation SLWebViewController
// 前进
- (IBAction)goForward:(id)sender {
    [_webView goBack];
}

// 后退
- (IBAction)goBack:(id)sender {
    [_webView goForward];
}

// 刷新
- (IBAction)refresh:(id)sender {
    [_webView reload];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    
    // 添加webView
    WKWebView *webView = [[WKWebView alloc] init];
    _webView = webView;
    [self.contentView addSubview:webView];
    _webView.backgroundColor = [UIColor grayColor];
    
    // 展示网页
    NSURLRequest *request = [NSURLRequest requestWithURL:_url];
    [webView loadRequest:request];
    
    // KVO 监听属性改变
    /*
        Observer: 观察者
        KeyPath: 观察webView哪些属性
        options: NSKeyValueObservingOptionNew: 观察他的新的值的改变
     
        KVO注意点: 一定要移除
     */
    [webView addObserver:self forKeyPath:@"canGoBack" options:NSKeyValueObservingOptionNew context:nil];
    [webView addObserver:self forKeyPath:@"canGoForward" options:NSKeyValueObservingOptionNew context:nil];
    [webView addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:nil];
    
    // 进度条
    [webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];
    
}

- (void)dealloc
{
    [self.webView removeObserver:self forKeyPath:@"canGoBack"];
    [self.webView removeObserver:self forKeyPath:@"canGoForward"];
    [self.webView removeObserver:self forKeyPath:@"title"];
    [self.webView removeObserver:self forKeyPath:@"estimatedProgress"];
}

// 只要观察的对象属性有新值就会调用
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
    NSLog(@"%d, %d", self.webView.canGoForward, self.webView.canGoBack);
    
    self.backItem.enabled = self.webView.canGoBack;
    self.forwardItem.enabled = self.webView.canGoForward;
    self.title = self.webView.title;
    self.progressView.progress = self.webView.estimatedProgress;
    self.progressView.hidden = self.webView.estimatedProgress >= 1;
}

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    _webView.frame = self.contentView.bounds;
}
【注意】:KVO一定要销毁:否则会在界面消失以后,造成程序崩溃
崩溃原因:reason: An instance 0x7fc701825400 of class WKWebView was deallocated while key value observers were still registered with it.
就是说:WKWebView被销毁以后,但是它的键值对仍然被注册监听

相关文章

  • webview进度条-ios

    使用KVO监听WKWebView的“estimatedProgress”属性,通过监听该属性的变化才是进度条的长度...

  • KVO监听WKWebView

  • iOS WKWebView显示加载进度条

    WKWebView有如下属性,可以用KVO监听实现加载页面的进度条显示 首页如下 点击WKWebView加载进度条...

  • OC底层原理学习笔记(二)- KVO、KVC的本质

    一、KVO 1、KVO实现属性监听的原理KVO俗称“键值监听”,可以用于监听某个对象属性值的改变未使用KVO监听的...

  • iOS KVO

    kvo:key-value-observing:键值监听,可以监听某个对象属性的值 前言 使用(kvo 监听foo...

  • iOS KVO

    什么是KVO KVO俗称“键值监听”,用来监听某个对象属性值的改变 KVO的使用 KVO 本质 在给某个对象添加K...

  • KVO - KVC 从根本原理透析

    一.KVO KVO的全称为Key-Value Observing,也就是我们常说的键值监听。通过KVO我们可以监听...

  • iOS KVO KVC

    KVO 什么是KVO? KVO的全称是Key-Value Observing,俗称"键值监听",可以用于监听摸个对...

  • KVO 相关

    1 . KVO 的基本使用kvo "键值监听", 全称"Key-Value Observing" ,监听对象属性...

  • KVO如何才能直接监听到数组的变化

    转自关于使用KVO监听数组的问题 首先,数组不能直接使用KVO使用监听。当我们想要使用KVO监听数组的状态时改变然...

网友评论

      本文标题:KVO监听WKWebView

      本文链接:https://www.haomeiwen.com/subject/qptrbttx.html