给 cell 传值时,直接将 model 传给 cell
1、使用第三方库 MJExtension 将字典转模型
2、在 cellForRowAtIndexPath: 中将 AppModel 创给 MyTableViewCell, 然后在 MyTabelViewCell 里面对 cell 内的每个控件进行赋值
3、MyTabelViewCell 类需要重写init(style: UITableViewCellStyle, reuseIdentifier resueIdentifier: String?){}方法
4、直接将 model 创给自定义 cell, 然后在自定义 cell 里面进行赋值,这样避免了cellForRowAtIndexPath:代码过多
代码:
ViewController.swift:
1 import UIKit 2 import MJExtension 3 class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 4 lazy var tableView: UITableView = { 5 6 let tableView: UITableView! 7 8 tableView = UITableView(frame: self.view.frame, style: .plain) 9 tableView.delegate = self 10 tableView.dataSource = self 11 12 return tableView 13 }() 14 15 // lazy 16 17 // var items = ["北京", "上海", "广东", "深圳", "杭州"] 18 var items = [["imageName": "1", "appName": "Football Maze", "appDescription": "足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球"], 19 ["imageName": "1", "appName": "租房点评", "appDescription": "足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球足球"], 20 ["imageName": "1", "appName": " iJump", "appDescription": "运动运动运动运动运动运动运动运动运动运动运动运动运动运动运动运动运动运动运动运动运动运动运动运动运动运动运动运动运动运动"], 21 ["imageName": "1", "appName": "哪里逃", "appDescription": "跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路跑路"]] 22 23 override func viewDidLoad() { 24 super.viewDidLoad() 25 26 // 将tableView 添加到 view 上 27 self.view.addSubview(self.tableView) 28 29 // self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "编辑", style: .done, target: self, action: #selector(ViewController.editButtonClick)) 30 31 // self.navigationItem.sel 32 } 33 34 override func didReceiveMemoryWarning() { 35 super.didReceiveMemoryWarning() 36 // Dispose of any resources that can be recreated. 37 } 38 39 // MARK: -UITableViewDelegate, UITableViewDataSource 40 // tableView 数据源: 返回几个组 41 func numberOfSections(in tableView: UITableView) -> Int { 42 return 1 43 } 44 45 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 46 47 let cellIdentifier = "cellIdentifier" 48 var cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as? MyTableViewCell 49 50 if cell == nil { 51 cell = MyTableViewCell(style: .subtitle, reuseIdentifier: cellIdentifier) 52 53 // 设置 cell 字体 54 cell?.textLabel?.font = UIFont.systemFont(ofSize: 14) 55 56 // 设置选中 cell 样式 57 cell?.selectionStyle = .gray 58 59 // 设置 cell 后面的箭头样式 60 cell?.accessoryType = .disclosureIndicator 61 62 } 63 64 // 设置 cell 的内容 65 // cell?.textLabel?.text = items[indexPath.row] 66 67 // 设置 cell 图片 68 // cell?.imageView?.image = UIImage(named: "1") 69 70 // cell?.detailTextLabel?.text = "详细信息介绍" 71 let cellModel: AppsModel = AppsModel.mj_object(withKeyValues: self.items[indexPath.row]) // 使用 MJExtension 将字典转模型 72 73 // 通过自定义方法给 cell 赋值 74 cell?.showAppInfoWithModel(model: cellModel) 75 76 return cell! 77 } 78 79 // 设置行高 80 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 81 return 60 82 } 83 }
MyTableViewCell.swift:
1 import UIKit 2 class MyTableViewCell: UITableViewCell { 3 var iconImageView: UIImageView! // 图片 4 var appNameLabel: UILabel! // 标题 5 var descriptionLabel: UILabel! // 描述 6 7 // 赋值方法 - 显示 cell 内容方法 8 func showAppInfoWithModel(model: AppsModel) { 9 // 获取 model 中的图片 10 iconImageView.image = UIImage(named: model.imageName!) 11 12 // 获取 model 中的App 名字 13 appNameLabel.text = model.appName 14 15 // 获取 model 中的 App 描述 16 descriptionLabel.text = model.appDescription 17 } 18 19 override init(style: UITableViewCellStyle, reuseIdentifier resueIdentifier: String?) { 20 super.init(style: style, reuseIdentifier: resueIdentifier) 21 22 // 创建 iconImageView 23 iconImageView = UIImageView(frame: CGRect(x: 10, y: 5, width: 40, height: 40)) 24 self.addSubview(iconImageView) 25 26 // 创建 appNameLabel 27 appNameLabel = UILabel(frame: CGRect(x: 60, y: 0, width: 220, height: 15)) 28 appNameLabel.font = UIFont.systemFont(ofSize: 16) 29 self.addSubview(appNameLabel) 30 31 // 创建 desctiptionLabel 32 descriptionLabel = UILabel(frame: CGRect(x: 60, y: 15, width: 220, height: 35)) 33 descriptionLabel.font = UIFont.systemFont(ofSize: 12) 34 descriptionLabel.numberOfLines = 2 35 descriptionLabel.textColor = UIColor.lightGray 36 self.addSubview(descriptionLabel) 37 } 38 39 required init?(coder aDecoder: NSCoder) { 40 fatalError("init(coder:) has not been implemented") 41 } 42 43 override func awakeFromNib() { 44 super.awakeFromNib() 45 // Initialization code 46 } 47 override func setSelected(_ selected: Bool, animated: Bool) { 48 super.setSelected(selected, animated: animated) 49 // Configure the view for the selected state 50 } 51 }
AppsModel.swift:
1 import UIKit 2 3 class AppsModel: NSObject { 4 5 var imageName: String? 6 var appName: String? 7 var appDescription: String? 8 }