You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Swift中结合TableView与TableViewCell显示Toast对话框

Swift实现跳转详情页时展示数据Toast的方案

1. 定义数据模型

先创建包含所有需要展示字段的数据模型,可根据实际需求扩展字段:

struct Item {
    let title: String
    let subtitle: String
    let detailInfo: String
    // 可添加更多自定义字段,如ID、创建时间等
}

2. 实现列表页(TableViewController)

处理TableView的数据源、代理,以及点击单元格的跳转逻辑:

class ListViewController: UITableViewController {
    // 测试数据,实际可从网络或本地获取
    private let items: [Item] = [
        Item(title: "商品A", subtitle: "电子产品", detailInfo: "售价¥999,库存100件"),
        Item(title: "商品B", subtitle: "家居用品", detailInfo: "售价¥199,库存50件")
    ]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "ItemCell")
        title = "商品列表"
    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        items.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "ItemCell", for: indexPath)
        let item = items[indexPath.row]
        cell.textLabel?.text = item.title
        cell.detailTextLabel?.text = item.subtitle
        return cell
    }
    
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        let selectedItem = items[indexPath.row]
        
        // 跳转详情页并传递数据
        let detailVC = DetailViewController()
        detailVC.selectedItem = selectedItem
        navigationController?.pushViewController(detailVC, animated: true)
    }
}

3. 封装Toast工具

给UIViewController添加扩展,实现通用的Toast展示方法,无需依赖第三方库:

extension UIViewController {
    /// 展示自定义Toast
    /// - Parameters:
    ///   - message: 要显示的内容
    ///   - duration: 显示时长(默认3秒)
    func showToast(with message: String, duration: TimeInterval = 3.0) {
        // 创建Toast容器视图
        let toastView = UIView()
        toastView.backgroundColor = UIColor.black.withAlphaComponent(0.7)
        toastView.layer.cornerRadius = 8
        toastView.translatesAutoresizingMaskIntoConstraints = false
        
        // 创建内容标签
        let toastLabel = UILabel()
        toastLabel.text = message
        toastLabel.textColor = .white
        toastLabel.font = UIFont.systemFont(ofSize: 14)
        toastLabel.numberOfLines = 0 // 支持多行显示
        toastLabel.textAlignment = .center
        toastLabel.translatesAutoresizingMaskIntoConstraints = false
        
        // 添加子视图
        toastView.addSubview(toastLabel)
        view.addSubview(toastView)
        
        // 设置约束
        NSLayoutConstraint.activate([
            toastLabel.leadingAnchor.constraint(equalTo: toastView.leadingAnchor, constant: 16),
            toastLabel.trailingAnchor.constraint(equalTo: toastView.trailingAnchor, constant: -16),
            toastLabel.topAnchor.constraint(equalTo: toastView.topAnchor, constant: 12),
            toastLabel.bottomAnchor.constraint(equalTo: toastView.bottomAnchor, constant: -12),
            
            toastView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            toastView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -20),
            toastView.widthAnchor.constraint(lessThanOrEqualTo: view.widthAnchor, multiplier: 0.8)
        ])
        
        // 淡入动画
        toastView.alpha = 0
        UIView.animate(withDuration: 0.3) {
            toastView.alpha = 1
        }
        
        // 延迟淡出并移除视图
        DispatchQueue.main.asyncAfter(deadline: .now() + duration) {
            UIView.animate(withDuration: 0.3) {
                toastView.alpha = 0
            } completion: { _ in
                toastView.removeFromSuperview()
            }
        }
    }
}

4. 实现详情页(DetailViewController)

接收传递的数据,组装成Toast需要展示的内容并触发显示:

class DetailViewController: UIViewController {
    var selectedItem: Item!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        title = "商品详情"
        
        // 组装所有数据为Toast展示文本
        let toastContent = """
        标题:\(selectedItem.title)
        分类:\(selectedItem.subtitle)
        详情:\(selectedItem.detailInfo)
        """
        
        // 展示Toast
        showToast(with: toastContent)
    }
}

注意事项

  • 如果使用Storyboard搭建界面,需确保TableViewCell和DetailViewController的Identifier与代码中一致
  • 可根据需求调整Toast的样式:修改背景色、圆角、字体、显示位置(如顶部显示)等
  • 若数据字段较多,可优化文本格式,比如添加分隔线或调整换行逻辑

内容的提问来源于stack exchange,提问作者Mateo Valencia Minota

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 00:10:32