在if语句中初始化不同单元格类型的更好方法

时间:2016-07-14 16:20:23

标签: ios swift

在我的代码中,如果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}},它没有任何属性,所以我似乎无法在两个分支之外进行。

4 个答案:

答案 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()