ios 如何根据reuseIdentifier控制我的单元格?

2guxujil  于 2022-12-01  发布在  iOS
关注(0)|答案(4)|浏览(108)

我创建了两个不同的单元格来显示其中的不同数据。我为它们分配了reuseIdentifier"TableCell""FixtureCell")。它们有两个不同的类,分别命名为FixtureTableViewCellLeagueTableViewCell
如果单元格标识符是"TableCell",我想这样做,显示TableCell
否则,如果单元格标识符为"FixtureCell",则显示FixtureCell
如何进行此控制?
我的代码如下。我只做了"TableCell"。我不能为另一个做。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tblLeagueTable.dequeueReusableCell(withIdentifier: "TableCell", for: indexPath) as! LeagueTableViewCell

    let teams = tableArray[indexPath.row]

    cell.lblLeagueTableTeam.text! = teams.teamName
    cell.lblOwnGoal.text! = teams.ownGoal
    cell.lblScoredGoal.text! = teams.scoredGoal
    cell.lblLeagueTableTotalMatch.text! = teams.totalMatch
    cell.lblTotalPoints.text! = teams.totalPoint

    return cell
}
rkue9o1l

rkue9o1l1#

根据以往的经验,基于IndexPath实现动态样式并不是一个好主意,我建议采用模型驱动的方案。
首先,定义一个模型,如下所示:

class DemoCellModel: NSObject {
    var identifier: String = ""
    var classTypeString: String?
    var cellData: NSObject?

    convenience init(identifier: String, classTypeString: String? = nil, cellData: NSObject? = nil) {
        self.init()
        self.identifier = identifier
        self.classTypeString = classTypeString
        self.cellData = cellData
    }
}

然后,创建一个模型数组:

var models: [DemoCellModel]  = []

override func viewDidLoad() {
    super.viewDidLoad()
    guard var bundleName = Bundle.main.object(forInfoDictionaryKey: "CFBundleName") as? String else { return }
    bundleName = bundleName + "."
    models.append(DemoCellModel(identifier: "TableCell", classTypeString: bundleName + "LeagueTableViewCell", cellData: nil))
    models.append(DemoCellModel(identifier: "FixtureCell", classTypeString: bundleName + "FixtureTableViewCell", cellData: nil))
}

最后,生成自定义单元格:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return models.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let model = models[indexPath.row]
    var cell = tableView.dequeueReusableCell(withIdentifier: model.identifier)
    if cell == nil {
        var cellClassType: UITableViewCell.Type
        if let classTypeString = model.classTypeString, let classType = (NSClassFromString(classTypeString) as? UITableViewCell.Type) {
            cellClassType = classType
        } else {
            cellClassType = UITableViewCell.self
        }
        cell = cellClassType.init(style: .default, reuseIdentifier: model.identifier)
    }

    if var cell = cell as? testProtocol {
        cell.cellData = model.cellData
    }

    return cell!
}

protocol testProtocol {
   var cellData: NSObject? { get set }
}
dfty9e19

dfty9e192#

基于indexPath,您决定了要显示的合适单元格,因此您的代码应类似于:

var cell: UITableViewCell?
if isTableViewCell(indexPath) {

    cell = tblLeagueTable.dequeueReusableCell(withIdentifier: "TableCell", for: indexPath) as! LeagueTableViewCell

    let teams = tableArray[indexPath.row]

    cell.lblLeagueTableTeam.text! = teams.teamName
    cell.lblOwnGoal.text! = teams.ownGoal
    cell.lblScoredGoal.text! = teams.scoredGoal
    cell.lblLeagueTableTotalMatch.text! = teams.totalMatch
    cell.lblTotalPoints.text! = teams.totalPoint

    } else {

    cell = tblLeagueTable.dequeueReusableCell(withIdentifier: "FixtureCell", for: indexPath) as! FixtureTableViewCell

    // Customize your FixtureCell here
}
zzlelutf

zzlelutf3#

我的单元实现了一个CListTableViewCellProtocol,其中只有一个config

protocol CListTableViewCellProtocol {
    mutating func config(data: MyData, callback: @escaping (_ value: Double) -> Void)
}

我已经将所有具体的内容封装在函数中,然后它就变得简单了:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cellIdentifier = getCellStyleForSection(indexPath.section).cellIdentifier()

    var cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! CListTableViewCellProtocol

    cell.config(data:getDataFromIndexPath(indexPath),
        callback: {
            (value: Double) -> Void in
            self.setCValue(indexPath: indexPath, value: value))
        }
    )

    return cell as! UITableViewCell
}

/// And a function to register the cells
func registerCells(tableView: UITableView) -> Void {

    self.tableView = tableView

    tableView.register(CListTableViewCell.self,
                       forCellReuseIdentifier: CCellStyle.editable.cellIdentifier())
    tableView.register(CListTableViewCellSmall.self,
                       forCellReuseIdentifier: CCellStyle.small.cellIdentifier())

}

CCellStyle只是一个枚举:

enum CCellStyle:String {
    case small = "CellSmall"
    case editable = "CellEditable"

    func height() -> Int {
        switch self {
        case .small:
            return 20
        case .editable:
            return 36
        }
    }

    func cellIdentifier() -> String {
        return self.rawValue
    }
}
mzmfm0qo

mzmfm0qo4#

试试这个:
请使用其他标识符作为表节。也可以使用 index.row

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let identifier: String = "TableCell"
    let fixtureIdentifier: String = "FixtureCell"
    var cell: UITableViewCell?
    cell = tableView.dequeueReusableCell(withIdentifier: indexPath.section == 0 ? identifier : fixtureIdentifier)
    if cell == nil {
        cell = UITableViewCell(style: .default, reuseIdentifier: indexPath.section == 0 ? identifier : fixtureIdentifier)
    }
    if indexPath.section == 0 {
       // Do code for TableCell
    }
    else if indexPath.section == 1 {
       // Do code for FixtureCell
    }
    return cell!
}

相关问题