iOS(SwiftUI)

最近更新时间:2025-11-12 11:43:42

我的收藏

组件概述

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 主组件需要与各个子页面(GroupListViewFriendApplicationListViewGroupApplicationListViewBlackListView)进行导航集成。跳转示例图如下所示:

实现步骤如下:
1. ContactListinit 方法中设置回调:当用户点击某个功能入口时,触发对应的回调函数。
2. 在回调中处理跳转:使用 NavigationLink 或状态变量控制子页面的显示。
3. 传递 contactStore:将父级的 contactStore 实例传递给子页面,确保数据一致性。
ContactListinit 方法回调和建议跳转子页面的对应关系:
好友申请页:onNewFriendsClick: (() -> Void)?
群聊申请页:onGroupApplicationsClick: (() -> Void)?
群聊列表页:onGroupListClick: (() -> Void)?
黑名单列表页:onBlackListClick: (() -> Void)?
以下是完整的集成示例,展示如何使用 NavigationLink 将这些组件粘合在一起。
import AtomicX
import SwiftUI

struct 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 = false
var 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 in
showGroupList = 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 in
showBlackList = 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()

// 在所有组件中使用同一个 contactStore
ContactList(contactStore: contactStore, ...)
GroupListView(contactStore: contactStore, ...)
FriendApplicationListView(contactStore: contactStore)

页面返回处理

在子页面的回调中,将状态变量设置为 false 以返回上一页:
GroupListView(
contactStore: contactStore,
onShowMessage: { conversation in
showGroupList = false // 关闭群组列表页面
// 执行其他操作,如跳转到聊天页面
}
)