网页容器控制器

主要重构目的

  • 剥离CWebView,NewsWebView内的业务
  • 聚合分散在 CWebView,NewsWebView,各个JSEvent内的业务
  • 简化网页的整体结构

主要的类以及协议

HXWebView

WKWebView 子类 (增加了KVO扩展实现)

HXWebViewController

功能(feature)容器控制器

HXWebViewFeatureBasic

功能(feature)基类, 所有的业务相关功能实现基于这个类

HXWebViewControllerProtocol

功能(feature)实现此协议, 在ViewController各个生命周期实现对应操作

基本实现

HXWebViewController 以及 HXWebViewFeatureBasic 之间关系

HXWebViewController 包含多个 HXWebViewFeatureBasic

HXWebViewController 以及 HXWebViewFeatureBasic

HXWebViewController 转发各个函数到 各个功能(feature)

HXWebViewController 实现了 WKWebView 的 代理 WKUIDelegate, WKNavigationDelegate, UIScrollDelegate,以及重写了 UIViewController中的生命周期方法, 会在调用函数的时候将事件转发给各个功能(feature)

具体实现看代码片段


/// HXWebViewController.m
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    for (id feature in self.features) {
        if ([feature conformsToProtocol:@protocol(HXWebViewControllerProtocol)]
                && [feature respondsToSelector:@selector(viewDidAppear:)]) {
            THSLogVerbose(@"feature %@ 调用 SEL: %@ 所属 protocol: %@ VC: %@ 参数 animated: %@", feature, NSStringFromSelector(@selector(viewDidAppear:)), NSStringFromProtocol(@protocol(HXWebViewControllerProtocol)), self, (animated ? @"@YES" : @"@NO"));
            [feature viewDidAppear:animated];
        }
    }
}

功能(feature)获取需要的上下文内容

HXWebViewFeatureBasic 有外部设置的 属性 HXWebViewController *webViewController 可以通过这个属性获取到所有需要的数据以及调用相关公共函数

使用示例

黑白版

HXWebViewFeatureThemeVersion.h


@interface HXWebViewFeatureThemeVersion : HXWebViewFeatureBasic <HXWebViewControllerProtocol>

@end

HXWebViewFeatureThemeVersion.m


@implement HXWebViewFeatureThemeVersion

- (void)viewDidLoad {
    [[NSNotificationCenter defaultCenter] addObserver:self selector@selector(changeThemeVersion:) name:ThemeVersionNotification object:nil];
}

- (void)changeThemeVersion:(id)sender {
    self.webViewController.webView.customUserAgent = [HXuserAgentManager shareInstance].modifiedUserAgent;
    [self.webViewController.webView reload];
}

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
@end