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
。
前面SampleDetailVC
的tableView
方法搬进extension SampleDetailViewDataSource
。注意删掉override
。
tableView
方法里面用的是传进来的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例子
本站说明
一起在知识的海洋里呛水吧。广告内容与本站无关。如果喜欢本站内容,欢迎投喂作者,谢谢支持服务器。如有疑问和建议,欢迎在下方评论~