iOS(SwiftUI)

最近更新时间:2026-02-24 15:15:09

我的收藏

组件概述

Search 是搜索组件,为用户提供搜索框、搜索结果展示、界面跳转等功能的完整组件集合。该组件支持用户搜索、群组搜索、消息搜索等功能,并提供了丰富的交互回调接口。
说明:
搜索为旗舰版或企业版功能,购买旗舰版或企业版套餐包后可使用,详情请参见 价格说明
搜索入口
搜索结果



组件集成

Search 组件属于 TUIKit SwiftUI 的一部分,集成 TUIKit SwiftUI 即可获取并使用 Search 组件。集成方法请参考文档 TUIKit SwiftUI 里的集成步骤,完成登录操作。

组件构成

SearchBar 是搜索的入口组件,对外仅暴露了搜索组件的初始化方法,其他逻辑均封装在 SearchBar 中。
方法名
参数
描述
init
onTapItem: @escaping (Any) -> Void
点击搜索到的结果回调,包括好友、群组、消息、会话等搜索结果条目。

基础用法

SearchBar 的搜索结果路由跳转如下:
自动路由:在搜索结果界面中,点击更多(More)按钮或聊天记录列表时,组件内部会通过 Navigator 自动完成页面跳转。
自定义路由:当用户点击具体的联系人、群组、会话或消息时,组件会触发相应的回调 onTapItem: @escaping (Any) -> Void,需在回调中实现自定义跳转(例如跳转到您的自定义聊天界面)。
示例代码如下:
// 初始化 SearchBar
SearchBar(onTapItem: { result in
handleSearchResult(result)
})

// 响应搜索结果的点击事件
// onConversationClick 是将事件抛给更上层,非必须。是否这样处理取决于开发者的项目层级。
private func handleSearchResult(_ result: Any) {
if let friendInfo = result as? FriendSearchInfo {
// 解析出联系人结果点击信息
let conversationID = ChatUtil.getC2CConversationID(friendInfo.userID)
var conversation = ConversationInfo(conversationID: conversationID)
conversation.type = .c2c
conversation.title = friendInfo.friendRemark ?? friendInfo.userInfo.nickname
conversation.avatarURL = friendInfo.userInfo.avatarURL
// 将事件抛到上层,由上层处理跳转单聊列表
onConversationClick?(NavigationInfo(conversation: conversation))
} else if let groupInfo = result as? GroupSearchInfo {
// 解析出群组结果点击信息
let conversationID = ChatUtil.getGroupConversationID(groupInfo.groupID)
var conversation = ConversationInfo(conversationID: conversationID)
conversation.type = .group
conversation.title = groupInfo.groupName
conversation.avatarURL = groupInfo.groupAvatarURL
// 将事件抛到上层,由上层处理跳转群聊列表
onConversationClick?(NavigationInfo(conversation: conversation))
} else if let messageDict = result as? [String: Any],
let messageInfo = messageDict["message"] as? MessageInfo,
let conversationID = messageDict["conversationID"] as? String
{
// 解析出消息结果点击信息
var conversation = ConversationInfo(conversationID: conversationID)
if conversationID.hasPrefix("c2c_") {
conversation.type = .c2c
} else {
conversation.type = .group
}
conversation.title = messageDict["conversationName"] as? String
conversation.avatarURL = messageDict["conversationAvatar"] as? String
// 将事件抛到上层,由上层处理跳转会话,且定位到指定消息
onConversationClick?(NavigationInfo(conversation: conversation, locateMessage: messageInfo))
} else if let conversationDict = result as? [String: Any],
let conversationID = conversationDict["conversationID"] as? String
{
// 解析出会话结果点击信息
var conversation = ConversationInfo(conversationID: conversationID)
if conversationID.hasPrefix("c2c_") {
conversation.type = .c2c
} else {
conversation.type = .group
}
conversation.title = conversationDict["conversationName"] as? String
conversation.avatarURL = conversationDict["conversationAvatar"] as? String
// 将事件抛到上层,由上层处理跳转会话
onConversationClick?(NavigationInfo(conversation: conversation))
}
}