Skip to content

iOS TableView Storyboard示例,详情页DataSource

更新日期 2022-2-22
  • 2022-2-22 创建文档
开发环境与工具
  • Xcode13
  • iOS 14.4
  • Swift

本文在显示详情示例基础上进行修改。引入UITableViewDataSource的使用。

数据类

数据类还是SampleEntity.swift不变,详情页就是要把它里面的一些数据展示出来

// SampleEntity.swift
import Foundation

struct SampleEntity {
    var title: String
    var desc: String
    var isComplete: Bool = false
    var updatedDate: Date
}

extension SampleEntity {
    static var testData = [
        SampleEntity(title: "iOS入门开发3", desc: "https://an.rustfisher.com", updatedDate: Date().addingTimeInterval(800.0)),
        // 其他模拟数据...
    ]
}

UITableViewDataSource

我们新建一个swift文件SampleDetailViewDataSource.swift。创建SampleDetailViewDataSource类继承NSObject

把前面控制ui显示的代码搬过来。先把DetailRow搬进来。

SampleDetailViewDataSource需要持有一个SampleEntity对象,这个对象在init的时候传进来。

新建extension SampleDetailViewDataSource继承UITableViewDataSource

前面SampleDetailVCtableView方法搬进extension SampleDetailViewDataSource。注意删掉overridetableView方法里面用的是传进来的SampleEntity对象。

完整代码如下

// SampleDetailViewDataSource.swift
import UIKit

// 查看详情
class SampleDetailViewDataSource: NSObject {
    enum DetailRow: Int, CaseIterable { // 显示时候用的
        case title // 标题
        case desc  // 文字描述
        case time  // 时间

        func getTxt(for d: SampleEntity?) -> String? {
            switch self {
            case .title:
                return d?.title
            case .desc:
                return d?.desc
            case .time:
                return d?.updatedDate.description // 先拿字符串描述
            }
        }

        var headImg: UIImage? { // 这里是var
            switch self {
            case .title:
                return nil // 标题不用小图标
            case .desc:
                return UIImage(systemName: "square.and.pencil")
            case .time:
                return UIImage(systemName: "clock")
            }
        }
    }

    private var entity: SampleEntity

    init(entity: SampleEntity) {
        self.entity = entity
        super.init()
    }
}

extension SampleDetailViewDataSource: UITableViewDataSource {
    static let detailCellId = "DetailCellId"

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return SampleEntity.testData.count // 示例数据的数量
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: Self.detailCellId, for: indexPath)
        let row = DetailRow(rawValue: indexPath.row)
        cell.textLabel?.text = row?.getTxt(for: entity) // 这里detail Entity定义在上面的类里
        cell.imageView?.image = row?.headImg
        return cell
    }
}

View Controller

改造一下SampleDetailVC。持有一个SampleDetailViewDataSource对象,在页面加载后创建对象,并把自己的SampleEntity传进去。

// SampleDetailVC.swift
import UIKit

class SampleDetailVC: UITableViewController {
    var detailEntity: SampleEntity?
    private var dataSource: SampleDetailViewDataSource?

    func cfg(with inputEntity: SampleEntity) {
        self.detailEntity = inputEntity
    }

    override func viewDidLoad() {
        guard let detailEntity = detailEntity else {
            print("没有传入详情信息")
            return
        }
        dataSource = SampleDetailViewDataSource(entity: detailEntity)
        tableView.dataSource = dataSource
    }
}


使用storyboard与TableView的一个ToDo例子

作者: rustfisher.com | rf.cs@foxmail.com
示例: AndroidTutorial Gitee, Tutorial Github
本文链接: https://www.an.rustfisher.com/ios/uikit/tableview/table-view-storyboard-sample4-ds/
一家之言,仅当抛砖引玉。如有错漏,还请指出。如果喜欢本站的内容,还请支持作者。也可点击1次下方的链接(链接内容与本站无关),谢谢支持服务器。 如有疑问,请与我联系:Android issues - gitee