Telegram研究:ItemListController使用之Chat Folders
Telegram:
仓库:https://github.com/TelegramMessenger/Telegram-iOS
tag: release-10.1
主要基类及协议:ItemListNodeEntry
、ListViewItem
+ItemListItem
、ItemListRevealOptionsItemNode
+ListViewItemNode
主要学习源码文件:ChatListFilterPresetListController.swift
、ChatListFilterPresetController.swift
主要业务类:
ChatListFilterPresetListEntry
、ChatListFilterPresetEntry
: 原始的数据ChatListFilterSettingsHeaderItem
+ItemListSectionHeaderItem
+ChatListFilterPresetListSuggestedItem
: 继承自ListViewItem, ItemListItem
,设置对应的展示Node,处理点击回调ChatListFilterSettingsHeaderItemNode
+CallListGroupCallItemNode
+CallListHoleItemNode
: 继承自ItemListRevealOptionsItemNode->ListViewItemNode
,设置Node的展示样式及做布局大小计算ItemListRevealOptionsItemNode
: 这个继承自ListViewItemNode
, 这个类定义了可以侧滑删除相关的交互
本例Demo: 仓库: https://github.com/h42330789/StudyIM/tree/feature/ListView/StudyAsynDisplay
分支:origin/feature/ItemListController
主要Demo文件:MyChatFolderVC.swift
、EditChatFolderVC.swift
PeerInfoScreen.swift → PeerInfoScreenNode → openSettings → .chatFolders →
ChatListFilterPresetListController.swift → chatListFilterPresetListController(context: …)
1、创建参数和回调 signal
signal.map(vcStatem (listState, arg)) → chatListFilterPresetListControllerEntries(presentationData:…) → 配置数据源 → [ChatListFilterPresetListEntry] → .screenHeader + .listHeader + .addItem + …
SIgnal需要配置的内容:
1.1 controller相关信息
ItemListControllerState(title: 标题,leftNavBtn, rightNavBtn, backNabBtn, …)
1.2 列表数据源信息
ItemListNodeState(entries: 数据源列表) → [ItemListNodeEntry] → chatListFilterPresetListControllerEntries
ChatListFilterPresetListEntry
1.2.1 需要实现 Identifiable
statbleId,
1.2.2 Comparable协议:
sortId
func <,
1.2.3: 配置Item → ListViewItem
ChatListFilterPresetListEntry → item(presentationData: …) → .screenHeader → ChatListFilterSettingsHeaderItem → nodeConfiguredForParams → ChatListFilterSettingsHeaderItemNode → node.asyncLayout()(…)
ChatListFilterPresetListEntry → item(presentationData: …) → .listHeader → ItemListSectionHeaderItem → nodeConfiguredForParams → ChatListFilterSettingsHeaderItemNode