gpt4 book ai didi

ios - 设计 UITableView/Cell - iOS

转载 作者:行者123 更新时间:2023-11-29 00:27:22 32 4
gpt4 key购买 nike

我正在设计一个 UITableView,使用 subview 来填充它的可重用单元格,我希望对此有一些意见。正如我所测试的,它运行良好。但是,我不知道这是否是一个好的解决方案。

场景是:我有一个包含不同类型单元格(布局)的表格 View 。当我设计时,它增长得很快(我的 Controller 代码),因为我必须注册大量单元并处理 cellForRow。然后我想到了这个想法,为一个独特的可重用单元实例化不同的 subview ,并使用“演示者”来处理委托(delegate)/数据源。你认为这是一个问题吗?这是一个好方法吗?

提前致谢!

Ps.:如有英文错误请见谅!

编辑:

这是项目中的 session ,后面是代码: bundle image

代码位于:

  • 订单详细单元格

    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
    }
    }
  • 订单详情 subview

    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

    }
    }

*抱歉这里缩进了...

就是这样!你觉得怎么样?

最佳答案

在这里你想要多个 UITableViewCell 子类来实现你想要的不同布局,然后在你的 TableView 数据源中选择相关的一个。

class Cell1: UITableViewCell {

let label = UILabel()

override init(style: UITableViewCellStyle, reuseIdentifier: String) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.contentView.addSubview(label)
}

... whatever other setup/layout you need to do in the class ...

}

class Cell2: UITableViewCell {

let imageView = UIImageView()

override init(style: UITableViewCellStyle, reuseIdentifier: String) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.contentView.addSubview(imageView)
}

... whatever other setup/layout you need to do in the class ...

}

然后在你的 View Controller 中

override func viewDidLoad() {
super.viewDidLoad()
tableView.register(Cell1.self, forCellReuseIdentifier: "cell1Identifier")
tableView.register(Cell2.self, forCellReuseIdentifier: "cell2Identifier")
}

...

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.row % 2 == 0 { // just alternating rows for example
let cell = tableView.dequeueReusableCell(withIdentifier: "cell1Identifier", for: indexPath) as! Cell1
// set data on cell
return cell
} else {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell2Identifier", for: indexPath) as! Cell2
// set data on cell
return cell
}
}

所以这只是一个例子,但是在表格 View 中使用两个不同的单元格子类来交替行。

关于ios - 设计 UITableView/Cell - iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42681623/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com