ReadViewSDK/Sources/RDReaderView/EPUBUI/RDEPUBReaderChapterListController.swift
shenlei c65c190b71 feat: EPUB阅读器搜索、注释、CFI模块及大书远距跳转优化
- 实现EPUB阅读器搜索功能及选中注释功能
- 优化CFI模块,修复代码审查发现的11个问题
- 实现大书远距目录跳转与后台补全优化方案
- 优化设置面板与章节运行时联动
- 重构及大量改进优化
2026-06-22 20:26:34 +08:00

67 lines
2.5 KiB
Swift

import UIKit
final class RDEPUBReaderChapterListController: UITableViewController {
var onSelectItem: ((RDEPUBReaderTableOfContentsItem) -> Void)?
private let items: [RDEPUBReaderTableOfContentsItem]
private let currentItem: RDEPUBReaderTableOfContentsItem?
private let theme: RDEPUBReaderTheme
init(
items: [RDEPUBReaderTableOfContentsItem],
currentItem: RDEPUBReaderTableOfContentsItem?,
theme: RDEPUBReaderTheme
) {
self.items = items
self.currentItem = currentItem
self.theme = theme
super.init(style: .plain)
title = "目录"
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
view.accessibilityIdentifier = "epub.reader.toc.panel"
tableView.accessibilityIdentifier = "epub.reader.toc.table"
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
tableView.tableFooterView = UIView(frame: .zero)
tableView.backgroundColor = theme.contentBackgroundColor
navigationController?.navigationBar.tintColor = theme.toolControlTextColor
navigationController?.navigationBar.barTintColor = theme.toolBackgroundColor
navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: theme.toolControlTextColor]
navigationController?.navigationBar.accessibilityIdentifier = "epub.reader.toc.navbar"
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
items.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let item = items[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.backgroundColor = theme.contentBackgroundColor
cell.textLabel?.numberOfLines = 2
cell.textLabel?.text = item.title
cell.textLabel?.textColor = isCurrentItem(item) ? .systemBlue : theme.contentTextColor
cell.indentationLevel = item.depth
cell.indentationWidth = 18
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
onSelectItem?(items[indexPath.row])
}
private func isCurrentItem(_ item: RDEPUBReaderTableOfContentsItem) -> Bool {
guard let currentItem else { return false }
return currentItem.href == item.href
}
}