我创建了两个不同的单元格来显示不同的数据。我给他们分配了reuseIdentifier ("TableCell"和"FixtureCell")。它们有两个不同的类,分别名为FixtureTableViewCell和LeagueTableViewCell
如果单元格标识符是"TableCell"显示TableCell,我想这样做
else如果单元格标识符为"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
}发布于 2017-06-24 13:33:14
根据以前的经验,基于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 }
}发布于 2017-06-24 10:22:35
根据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
}发布于 2017-06-24 10:24:43
我的单元实现了一个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 funciton 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
}
}https://stackoverflow.com/questions/44732091
复制相似问题