Skip to content
能力中心
产品中心
应用市场
WebOffice
开发者后台

自定义文档容器界面

协作中台SDK 支持文档容器界面的自定义。可以通过设置文档容器视图控制器的页面代理并实现相关协议方法来完成文档容器界面的自定义,自定义协议定义在 KIMDocumentWebViewControllerDelegate 中。

接口定义

KIMDocumentWebViewControllerDelegate

方法参数返回值说明
documentWebViewController(_:
configTitleView:)
• controller: KIMDocumentWebViewController
文档视图控制器。
• titleView: KIMDocumentTitleView
标题视图。
Void配置文档页面导航栏标题视图。可实现该方法,通过 titleView 参数获取导航栏标题视图控件,对标题视图控件进行配置,如修改标题样式、添加左右侧按钮等。
documentWebViewController(_:
updateTitleView:)
• controller: KIMDocumentWebViewController
文档视图控制器。
• titleView: KIMDocumentTitleView
标题视图。
Void更新导航栏标题视图。SDK内部有相关修改标题视图的逻辑,如更新标题展示等,当标题视图发生更新时会调用该代理方法,可通过实现该方法对 titleView 内部变化进行监听,以便对 titleView 进行必要的二次处理。
documentWebViewController(_:
updateWebDocumentPopupMenus:)
• controller: KIMDocumentWebViewController
文档视图控制器。
• menus: [KIMWebDocumentMenuItem]
底部菜单默认数据源。
[KIMWebDocumentMenuItem]
修改后的底部菜单默认数据源。
更新文档容器底部菜单数据源。底部菜单界面数据刷新时会调用该方法,可实现该方法对底部菜单数据进行二次加工,menus 为底部菜单列表的默认数据,可基于默认 menus 进行改造,如修改排序、插入、删除元素,返回新的 KIMWebDocumentMenuItem 数组。
documentWebViewController(_:
onClickedWebDocumentMenuItem:
defaultHandler:)
• controller: KIMDocumentWebViewController
文档视图控制器。
• item: KIMWebDocumentMenuItem
被点击的item。
• defaultHandler: () -> Void
默认点击处理,调用该闭包执行SDK内部默认点击行为。
Void底部菜单item点击事件拦截。点击底部菜单的某个item时会调用该方法,可以实现该方法拦截点击事件,执行自定义操作。如果需要执行SDK内部默认点击行为,可以调用 defaultHandler 闭包实现。

自定义示例

自定义标题栏

文档列表标题栏默认展示了标题及右侧搜索按钮。可通过实现KIMDocumentWebViewControllerDelegateconfigTitleView 协议方法来自定义标题栏的展示及点击事件。

代码示例

Swift
// 1. 继承自文档视图控制器。
class CustomDocumentWebViewController: KIMDocumentWebViewController { 

    // 2. 重写初始化方法,设置页面自定义协议代理。
    required init(viewModel: KIMDocumentWebViewModel) {
        super.init(viewModel: viewModel)
        self.delegate = self
    }
}
 // 3.实现 KIMDocumentWebViewControllerDelegate 相关协议方法。
extension CustomDocumentWebViewController: KIMDocumentWebViewControllerDelegate {

    func documentWebViewController(_ controller: KIMDocumentWebViewController, configTitleView titleView: KIMDocumentTitleView) {
        // 设置标题颜色
        titleView.titleAttributes = [.foregroundColor: UIColor.blue]

        // 隐藏标题栏返回按钮
        titleView.setBackButton(hide: true)

        // 设置返回按钮点击事件
        titleView.setBackButtonAction {
            // 返回按钮事件回调
        }

        // 添加导航栏左侧按钮
        // 注意: 添加的 item 请使用 AutoLayout 设置好宽高, 或包含自适应宽高
        titleView.setLeftItems([customButton()])

        // 添加导航栏右侧按钮
        // 注意: 添加的 item 请使用 AutoLayout 设置好宽高, 或包含自适应宽高
        titleView.setRightItems([customButton()])
    }
    
    
    func documentWebViewController(_ controller: KIMDocumentWebViewController, updateTitleView titleView: KIMDocumentTitleView) {
         // 内部 SDK 对 titleView 更新的时候会调用该方法,有可能会覆盖 SDK 外部的配置,可以在此处再次配置覆盖 SDK 的更新
    }
}

自定义底部菜单

底部菜单默认展示了“分享”、“刷新”等菜单,可通过实现KIMDocumentWebViewControllerDelegateupdateWebDocumentPopupMenusonClickedWebDocumentMenuItem 等协议方法来自定义菜单项及其点击事件。

代码示例

Swift
// 1. 继承自文档视图控制器。
class CustomDocumentWebViewController: KIMDocumentWebViewController { 

    // 2. 重写初始化方法,设置页面自定义协议代理。
    required init(viewModel: KIMDocumentWebViewModel) {
        super.init(viewModel: viewModel)
        self.delegate = self
    }
}
 // 3.实现 KIMDocumentWebViewControllerDelegate 相关协议方法。
extension CustomDocumentWebViewController: KIMDocumentWebViewControllerDelegate {
    // 自定义底部菜单
    func documentWebViewController(_ controller: KIMDocumentWebViewController, updateWebDocumentPopupMenus menus: [KIMWebDocumentMenuItem]) -> [KIMWebDocumentMenuItem] {
        var menus = menus
        // 移除 “星标” item 示例
        menus.removeAll(where: { $0.id == KIMWebDocumentMenuItem.star })
        // 自定义底部菜单的数量、图标、名称。
        menus.insert(.init(id: customMenuItemID1, icon: UIImage(named: "demo_custom_button"), label: I18n.custom("1")), at: 1)
        menus.insert(.init(id: customMenuItemID2, icon: UIImage(named: "demo_custom_button"), label: I18n.custom("2")), at: 2)

        return menus
    }
    
    // 自定义菜单按钮点击事件
    func documentWebViewController(_ controller: KIMDocumentWebViewController, onClickedWebDocumentMenuItem item: KIMWebDocumentMenuItem, defaultHandler: @escaping () -> Void) {
        let delay = 2.0
        if item.id == customMenuItemID1 {
            // "自定义菜单1/2被点击"
            KIMHud.showMessage(I18n.customMenuClicked("1"), inView: self.view)
        } else if item.id == customMenuItemID2 {
            KIMHud.showMessage(I18n.customMenuClicked("2"), inView: self.view)
        } else {
            defaultHandler()
        }
    }
}

全局替换视图控制器

如果子类化文档容器视图控制器后,希望SDK内部入口在初始化文档容器页面时都使用子类类型,可以通过设置文档容器视图控制器的子类类型documentWebViewControllerType来达到效果。

代码示例

Swift
KIM.docsModule.documentWebViewControllerType = CustomDocumentWebViewController.self