实现 iOS 聊天界面@功能

1. 总览

在实现 iOS 聊天界面的@功能之前,首先需要理解整个实现流程。下面是整件事情的流程表格:

步骤 描述
步骤1 创建聊天界面
步骤2 实现@功能
步骤3 显示可@的用户列表
步骤4 处理@事件
步骤5 高亮显示被@的用户

接下来,我将逐步介绍每个步骤所需做的事情以及相应的代码。

2. 创建聊天界面

首先,我们需要创建一个聊天界面来展示聊天内容和实现@功能。可以使用一个 UITableView 来显示聊天消息列表,并在底部添加一个输入框用于发送消息。这里假设已经创建了一个名为 ChatViewController 的视图控制器,并将其关联到对应的 Storyboard

代码:

class ChatViewController: UIViewController {
    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var messageTextField: UITextField!
    @IBOutlet weak var sendButton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 设置 tableView 的代理和数据源
        tableView.delegate = self
        tableView.dataSource = self
        
        // 注册自定义的消息单元格
        tableView.register(UINib(nibName: "MessageCell", bundle: nil), forCellReuseIdentifier: "MessageCell")
    }
    
    // 其他方法...
}

以上是创建聊天界面的代码,其中 tableView 是用来展示聊天消息的表格视图, messageTextField 是用来输入聊天消息的文本框, sendButton 是发送按钮。

3. 实现@功能

接下来,我们需要实现@功能,使得用户在输入框中输入 @ 符号后能够选择要@的用户。我们可以通过监听输入框的文本改变事件来实现这个功能。

代码:

extension ChatViewController: UITextFieldDelegate {
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        // 判断用户是否输入了 @ 符号
        if string == "@" {
            // 显示可@的用户列表
            showUserList()
        }
        
        return true
    }
    
    // 其他方法...
}

以上代码中,我们通过实现 textField(_:shouldChangeCharactersIn:replacementString:) 方法,并在其中判断用户是否输入了 @ 符号。如果用户输入了 @ 符号,则调用 showUserList() 方法来显示可@的用户列表。

4. 显示可@的用户列表

在这一步中,我们需要显示可@的用户列表供用户选择。可以使用一个弹出视图或者一个新的视图控制器来展示用户列表。为了方便演示,这里使用一个简单的弹出视图来展示用户列表。

代码:

func showUserList() {
    let userListViewController = UserListViewController()
    userListViewController.delegate = self
    
    // 显示弹出视图
    present(userListViewController, animated: true, completion: nil)
}

以上代码中,我们创建了一个名为 UserListViewController 的视图控制器,并设置其代理为当前聊天界面。然后通过调用 present(_:animated:completion:) 方法来显示弹出视图。

5. 处理@事件

当用户从可@的用户列表中选择一个用户后,我们需要处理相应的@事件,并将被@的用户添加到输入框中。在之前的步骤中,我们已经设置了 UserListViewController 的代理为当前聊天界面,可以通过代理方法来处理@事件。

代码:

extension ChatViewController: UserListViewControllerDelegate {
    func didSelectUser(_ user: User) {
        // 将被@的用户添加到输入框中
        messageTextField.text += "@\(user.username) "
        
        // 隐藏可@的用户列表
        dismiss(animated: true, completion: nil)
    }
    
    // 其他方法...
}

以上代码中,我们实现了 UserListViewControllerDelegatedidSelectUser(_:) 方法,并在其中将被@的用户添加到输入框中,同时隐藏可@的用户