在我的代码中,如果cell
位于第一个tableView
部分,则var cell = UITableViewCell()
if indexPath.section == 0 {
cell = tableView.dequeueReusableCellWithIdentifier("UpcomingWorkoutCell", forIndexPath: indexPath) as! MyWorkoutsTableViewCell
cell.nameLabel.text = workout.trainer.name
cell.dateLabel.text = workout.getDateString()
cell.timeLabel.text = workout.getTimeString()
cell.trainerImage.image = workout.image
} else {
cell = tableView.dequeueReusableCellWithIdentifier("PastWorkoutCell", forIndexPath: indexPath) as! PastWorkoutTableViewCell
cell.nameLabel.text = workout.trainer.name
cell.dateLabel.text = workout.getDateString()
cell.timeLabel.text = workout.getTimeString()
cell.trainerImage.image = workout.image
cell.ratingControl.rating = workout.rating // Exclusive to PastWorkoutCell
}
将属于一种类型;如果不属于UITableViewCell
部分,则属于另一种类型。
UITableViewCell
有没有更好的方法来写这个?我可以以某种方式将初始声明删除为{{1}}并将我的代码缩短一行吗?
此外,MyWorkoutsTableViewCell和PastWorkoutCell几乎具有所有属性。我可以避免在if语句的每个分支中重复代码来设置所有这些代码吗?现在单元格是{{1}},它没有任何属性,所以我似乎无法在两个分支之外进行。
答案 0 :(得分:5)
你试试这个吗?
var cell = tableView.dequeueReusableCellWithIdentifier("UpcomingWorkoutCell", forIndexPath: indexPath) as! MyWorkoutsTableViewCell
if indexPath.section != 0 {
cell = tableView.dequeueReusableCellWithIdentifier("PastWorkoutCell", forIndexPath: indexPath) as! PastWorkoutTableViewCell
cell.ratingControl.rating = workout.rating
}
cell.nameLabel.text = workout.trainer.name
cell.dateLabel.text = workout.getDateString()
cell.timeLabel.text = workout.getTimeString()
cell.trainerImage.image = workout.image
答案 1 :(得分:1)
对您的代码唯一不愉快的是第一行中声明的cell
会立即被 real 单元替换。为避免这种情况,请使用定义和调用函数:
let cell : UITableViewCell = {
if indexPath.section == 0 {
let cell = // ...
return cell
}
else {
let cell = // ...
return cell
}
}()
可以通过公共(抽象)超类来避免重复。
class MyCell : UITableViewCell {
// declare nameLabel, dateLabel, timeLabel etc.
}
class MyWorkoutsTableViewCell: MyCell {}
class PastWorkoutCell: MyCell {}
现在我们可以像这样重组:
let cell : MyCell = {
if indexPath.section == 0 {
let cell = // ...
return cell
}
else {
let cell = // ...
return cell
}
}()
// configure MyCell once, here, and return it
答案 2 :(得分:0)
var cell = UITableViewCell()
if indexPath.section == 0 {
cell = tableView.dequeueReusableCellWithIdentifier("UpcomingWorkoutCell", forIndexPath: indexPath) as! MyWorkoutsTableViewCell
} else {
cell = tableView.dequeueReusableCellWithIdentifier("PastWorkoutCell", forIndexPath: indexPath) as! PastWorkoutTableViewCell
}
cell.nameLabel.text = workout.trainer.name
cell.dateLabel.text = workout.getDateString()
cell.timeLabel.text = workout.getTimeString()
cell.trainerImage.image = workout.image
答案 3 :(得分:0)
Nirav的答案很好,除了有点变化
var cell = tableView.dequeueReusableCellWithIdentifier("UpcomingWorkoutCell", forIndexPath: indexPath) as! MyWorkoutsTableViewCell
if indexPath.section != 0 {
cell = tableView.dequeueReusableCellWithIdentifier("PastWorkoutCell", forIndexPath: indexPath) as! PastWorkoutTableViewCell
cell.ratingControl.rating = workout.rating
}
cell.nameLabel.text = workout.trainer.name
cell.dateLabel.text = workout.getDateString()
cell.timeLabel.text = workout.getTimeString()