【发布时间】:2017-03-08 20:46:45
【问题描述】:
我正在设计一个 UITableView 使用子视图来填充它的可重用单元格,我希望对此有一些看法。 正如我测试过的,它运行良好。但是,我不知道这是否是一个好的解决方案。
场景是:我有一个包含不同类型单元格(布局)的表格视图。当我在设计时,它增长很快(我的控制器代码),因为我必须注册很多单元格并处理 cellForRow。然后我有了这个想法,为一个独特的可重用单元实例化不同的子视图,并使用“Presenter”来处理委托/数据源。你觉得这是个问题吗?这是一个好方法吗?
提前致谢!
Ps.: 抱歉有任何英文错误!
已编辑:
代码在:
-
OrderDetailCell
class OrderDetailCell: UITableViewCell { //MARK: Outlets @IBOutlet weak var cellHeight: NSLayoutConstraint! @IBOutlet weak var viewContent: UIView! //Variables var didUpdateLayout = false internal func setupLayoutWith(view: UIView){ cellHeight.constant = view.frame.height viewContent.frame = view.frame viewContent.addSubview(view) updateConstraints() layoutIfNeeded() didUpdateLayout = true } } -
OrderDetailSubview
class OrderDetailSubview: UIView { var type: OrderDetailsSubViewType? var height: CGFloat = 1 class func instanceFromNib(withType type: OrderDetailsSubViewType) -> OrderDetailSubview { let view = UINib(nibName: type.rawValue, bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! OrderDetailSubview switch type { case .OrderDetailSubviewStatus: view.height = 258 case .OrderDetailSubViewItem: view.height = 129 case .OrderDetailSubViewStoreInformation: view.height = 317 case .OrderDetailSubViewEvaluation: view.height = 150 } view.updateConstraints() view.layoutIfNeeded() return view } } -
OrderDetailPresenter
enum OrderDetailsSubViewType: String { case OrderDetailSubviewStatus = "OrderDetailSubviewStatus", OrderDetailSubViewItem = "OrderDetailSubViewItem", OrderDetailSubViewStoreInformation = "OrderDetailSubViewStoreInformation", OrderDetailSubViewEvaluation = "OrderDetailSubViewEvaluation" static let types = [OrderDetailSubviewStatus, OrderDetailSubViewItem, OrderDetailSubViewStoreInformation, OrderDetailSubViewEvaluation] } class OrderDetailPresenter { //Constants let numberOfSections = 4 //Variables // var order: Order? func setup(reusableCell: UITableViewCell, forRowInSection section: Int) -> OrderDetailCell { let cell = reusableCell as! OrderDetailCell for sub in cell.viewContent.subviews { sub.removeFromSuperview() } let subView = OrderDetailSubview.instanceFromNib(withType: OrderDetailsSubViewType.types[section]) cell.setupLayoutWith(view: subView) return cell } func numberOfRowsForSection(_ section: Int) -> Int { switch section { case 1: //TODO: count de offerList return 4 default: return 1 } } } -
OrderDetailViewController
class OrderDetailViewController: BaseViewController { //MARK: Outlets @IBOutlet weak var tableView: UITableView! var presenter = OrderDetailPresenter() override func setupView() { setupTableView() } } extension OrderDetailViewController: UITableViewDataSource, UITableViewDelegate { internal func setupTableView() { tableView.delegate = self tableView.dataSource = self tableView.estimatedRowHeight = 600 tableView.rowHeight = UITableViewAutomaticDimension tableView.register(UINib(nibName: "OrderDetailCell", bundle: nil), forCellReuseIdentifier: "OrderDetailCell") } func numberOfSections(in tableView: UITableView) -> Int { return presenter.numberOfSections } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return presenter.numberOfRowsForSection(section) } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let reusableCell = tableView.dequeueReusableCell(withIdentifier: "OrderDetailCell") as! OrderDetailCell let cell = presenter.setup(reusableCell: reusableCell, forRowInSection: indexPath.section) return cell } }
*抱歉这里有缩进...
就是这样!你怎么看?
【问题讨论】:
-
如果您遵循了正确的 iOS 编码实践(例如
dequeueing一个单元格)并且您的代码没有错误,那么很难说您的代码不好。如果您的代码存在问题(如崩溃、逻辑错误或性能问题),请编辑您的问题以包含您的代码并提出特定问题。如果你想让别人检查你的代码,那么你可以试试codereview.stackexchange.com -
感谢@RoboticCat,我已按照建议进行操作。问题是,我有多种细胞类型。因此,我只创建了一个,而不是创建许多单元格,现在我正在为具有相同单元格的每一行实例化一个子视图,并更新布局。运行良好,我只是想要一些意见。也感谢 codereview 的建议.. 以前从未听说过。我会努力的!
标签: ios iphone uitableview design-patterns tableviewcell