组件概述
ContactList 是基于 SwiftUI 构建的联系人列表组件,为用户提供完整的联系人管理功能。该组件支持好友列表展示、好友申请处理、群组列表管理、黑名单管理等功能,并提供了丰富的交互回调接口。
联系人列表 | 群组列表 | 好友申请列表 |
![]() | ![]() | ![]() |
组件集成
ContactList 组件属于 TUIKit SwiftUI 的一部分,集成 TUIKit SwiftUI 即可获取并使用 ContactList 组件。集成方法请参考文档 TUIKit SwiftUI 里的集成步骤。组件构成
ContactList 是联系人列表里的主组件,对应着整个联系人列表页框架,提供了一个对外的初始化 init 方法:方法名 | 参数 | 描述 |
init | contactStore: ContactListStore | 联系人数据存储,默认请使用 ContactListStore.create() 创建 |
| onShowMessage: ((ConversationInfo) -> Void)? | 点击联系人发送消息的回调,可选参数 |
| onContactClick: ((AZOrderedListItem) -> Void)? | 点击联系人的回调,可选参数 |
| onGroupClick: ((AZOrderedListItem) -> Void)? | 点击群组的回调,可选参数 |
| onNewFriendsClick: (() -> Void)? | 点击新的好友申请的回调,可选参数 |
| onGroupApplicationsClick: (() -> Void)? | 点击群组申请的回调,可选参数 |
| onGroupListClick: (() -> Void)? | 点击群组列表的回调,可选参数 |
| onBlackListClick: (() -> Void)? | 点击黑名单的回调,可选参数 |
ContactList 上半部分预留了各个子视图的入口 cell,例如好友申请、群聊申请、群组列表和黑名单列表。下半部分内嵌了联系人列表,如下图所示:
ContactList 是一个纯数据展示组件,不包含页面跳转逻辑。您需要在初始化时通过回调参数来处理子页面的跳转。子页面(如好友申请列表、群组列表等)提供了各自的
init 方法,详情如下:子页面 | 方法名 | 参数 | 描述 |
好友申请页(FriendApplicationListView) | init | contactStore: ContactListStore | 联系人数据存储,从 ContactList 传过来 |
群组申请页(GroupApplicationListView) | init | contactStore: ContactListStore | 联系人数据存储,从 ContactList 传过来 |
群组列表页 (GroupListView) | init | contactStore: ContactListStore | 联系人数据存储,从 ContactList 传过来 |
| | onShowMessage: ((ConversationInfo) -> Void)? | 点击群组发送消息的回调,可选参数 |
| | onShowProfile: ((AZOrderedListItem) -> Void)? | 点击群组查看详情的回调,可选参数 |
黑名单列表页 (BlackListView) | init | contactStore: ContactListStore | 联系人数据存储,从 ContactList 传过来 |
| | onShowProfile: ((AZOrderedListItem) -> Void)? | 点击黑名单用户查看详情的回调,可选参数 |
为什么
ContactList 不包含子页面跳转逻辑?ContactList 被设计为一个专注于数据展示的组件,而不是一个完整的页面容器。这种设计确保了组件的灵活性和可复用性:导航控制权在外层:
ContactList 通常被嵌入在更大的页面结构中,导航需要由外层统一管理适配不同场景:不同应用可能有不同的导航需求(模态弹窗、页面跳转、Tab切换等)
职责分离:
ContactList 负责"通知"点击事件,外层页面负责具体的跳转逻辑基础用法
完整页面导航集成
在实际应用中,
ContactList 主组件需要与各个子页面(GroupListView、FriendApplicationListView、GroupApplicationListView、BlackListView)进行导航集成。跳转示例图如下所示:
实现步骤如下:
1. 在
ContactList 的 init 方法中设置回调:当用户点击某个功能入口时,触发对应的回调函数。2. 在回调中处理跳转:使用
NavigationLink 或状态变量控制子页面的显示。3. 传递
contactStore:将父级的 contactStore 实例传递给子页面,确保数据一致性。ContactList 的 init 方法回调和建议跳转子页面的对应关系:好友申请页:
onNewFriendsClick: (() -> Void)?群聊申请页:
onGroupApplicationsClick: (() -> Void)?群聊列表页:
onGroupListClick: (() -> Void)?黑名单列表页:
onBlackListClick: (() -> Void)?以下是完整的集成示例,展示如何使用 NavigationLink 将这些组件粘合在一起。
import AtomicXimport SwiftUIstruct ContactsPage: View {private let contactStore = ContactListStore.create()// 页面显示状态@State private var showGroupList: Bool = false@State private var showBlackList: Bool = false@State private var showNewFriends: Bool = false@State private var showGroupApplications: Bool = falsevar body: some View {ZStack {// 主联系人列表ContactList(contactStore: contactStore,onContactClick: { contact in// 处理联系人点击print("点击联系人: \\(contact.title)")},onNewFriendsClick: {showNewFriends = true},onGroupApplicationsClick: {showGroupApplications = true},onGroupListClick: {showGroupList = true},onBlackListClick: {showBlackList = true})// 隐藏的 NavigationLink 用于页面跳转ZStack {// 群组列表页面NavigationLink(destination: GroupListView(contactStore: contactStore,onShowMessage: { conversation inshowGroupList = false// 跳转到聊天页面print("打开群聊: \\(conversation.conversationID)")}).navigationBarTitle(LocalizedChatString("ContactsGroupChats"), displayMode: .inline).navigationBarItems(leading: Button(action: {showGroupList = false}) {Image(systemName: "chevron.left").foregroundColor(.blue)}).navigationBarBackButtonHidden(true),isActive: $showGroupList) {EmptyView()}.hidden()// 黑名单页面NavigationLink(destination: BlackListView(contactStore: contactStore,onShowProfile: { userItem inshowBlackList = false// 查看用户详情print("查看黑名单用户: \\(userItem.title)")}).navigationBarTitle(LocalizedChatString("ContactsBlackList"), displayMode: .inline).navigationBarItems(leading: Button(action: {showBlackList = false}) {Image(systemName: "chevron.left").foregroundColor(.blue)}).navigationBarBackButtonHidden(true),isActive: $showBlackList) {EmptyView()}.hidden()// 好友申请列表页面NavigationLink(destination: FriendApplicationListView(contactStore: contactStore).navigationTitle(LocalizedChatString("ContactsNewFriends")).navigationBarItems(leading: Button(action: {showNewFriends = false}) {Image(systemName: "chevron.left").foregroundColor(.blue)}).navigationBarBackButtonHidden(true),isActive: $showNewFriends) {EmptyView()}.hidden()// 群组申请列表页面NavigationLink(destination: GroupApplicationListView(contactStore: contactStore).navigationTitle(LocalizedChatString("ContactsGroupApplications")).navigationBarItems(leading: Button(action: {showGroupApplications = false}) {Image(systemName: "chevron.left").foregroundColor(.blue)}).navigationBarBackButtonHidden(true),isActive: $showGroupApplications) {EmptyView()}.hidden()}}}}
集成要点说明
状态管理
使用
@State 变量控制各个子页面的显示状态:@State private var showGroupList: Bool = false@State private var showBlackList: Bool = false@State private var showNewFriends: Bool = false@State private var showGroupApplications: Bool = false
回调处理
在 ContactList 的回调中设置对应的状态变量为
true,触发页面跳转:ContactList(onNewFriendsClick: {showNewFriends = true // 触发跳转到好友申请页面},onGroupListClick: {showGroupList = true // 触发跳转到群组列表页面}// ... 其他回调)
NavigationLink 配置
使用隐藏的 NavigationLink 实现页面跳转:
使用
isActive 绑定状态变量使用
.hidden() 隐藏 NavigationLink配置自定义导航栏和返回按钮
数据共享
所有子页面共享同一个
contactStore 实例,避免资源浪费,确保数据一致性:private let contactStore = ContactListStore.create()// 在所有组件中使用同一个 contactStoreContactList(contactStore: contactStore, ...)GroupListView(contactStore: contactStore, ...)FriendApplicationListView(contactStore: contactStore)
页面返回处理
在子页面的回调中,将状态变量设置为
false 以返回上一页:GroupListView(contactStore: contactStore,onShowMessage: { conversation inshowGroupList = false // 关闭群组列表页面// 执行其他操作,如跳转到聊天页面})


