从UIViewController将变量传递给自定义UITableViewCell

时间:2016-03-12 11:42:56

标签: ios swift uiviewcontroller uitableview

以下是我在RunningTableViewCell内使用自定义UITableViewCell UIViewController的方式:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) as! RunningTableViewCell

    //.......

    cell.isTop = false
    if(indexPath.row == 0){
        cell.isTop = true
    }

    cell.isBottom = false
    if(indexPath.row == myArray.count-1){
        cell.isBottom = true
    }

    return cell
}

这是我的RunningTableViewCell课程:( Cell的内部GUI是在故事板中制作的)

class RunningTableViewCell: UITableViewCell {

    //@IBOutlet ...
    @IBOutlet weak var myButton: SomeButton!

    var isTop: Bool?
    var isBottom: Bool?

    override func awakeFromNib() {
        super.awakeFromNib()

        print("result: \(self.isTop) \(self.isBottom)")

        myButton.isTop = self.isTop
        myButton.isBottom = self.isBottom
    }
}

返回result: nil nil

结果的用法是:(SomeButtonRunningTableViewCell内的子视图)

class SomeButton: UIButton {
    var isTop = false
    var isBottom = false

    override func drawRect(rect: CGRect) {
        if(isTop){
            // DO SOMETHING...
        }
        if(isBottom){
            // DO SOMETHING...
        }
    }
}

那么如何将数据传递给RunningTableViewCell?

4 个答案:

答案 0 :(得分:4)

在视图及其子视图被分配和初始化之后立即调用

awakeFromNib

因此,在委托方法awakeFromNib之前调用每个单元格RunningTableViewCellfunc tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell的代码。这就是isTopisBottomnilawakeFromNib的原因。

您可以在RunningTableViewCell中定义方法,该方法将使用此变量加载单元格。

func load(isTop: Bool, isBottom: Bool) {
    self.isTop = isTop
    self.isBottom = isBottom

    // Update cell UI as you wish
}

最后在视图控制器中重写委托方法func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) as! RunningTableViewCell

    let isTop = indexPath.row == 0
    let isBottom = indexPath.row == myArray.count-1

    cell.load(isTop, isBottom: isBottom)

    return cell
}

答案 1 :(得分:1)

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) as! RunningTableViewCell

    //.......

    cell.isTop = false
    if(indexPath.row == 0){
        cell.isTop = true
        cell.tag=100
    }

    cell.isBottom = false
    if(indexPath.row == myArray.count-1){
        cell.isBottom = true
        cell.tag=200
    }

    return cell
}

也可以这样......

class RunningTableViewCell: UITableViewCell {

        //@IBOutlet ...

        var isTop: Bool?
        var isBottom: Bool?

        override func awakeFromNib() {
            super.awakeFromNib()
            if (self.tag==100)
            {
                isTop=true
            }
            else if (self.tag==200) {
                isBottom=true
            }
            else{
                isTop=false
                isBottom=false
            }

            print("result: \(self.isTop) \(self.isBottom)")
        }
    }

并且还使用单例方法......

答案 2 :(得分:1)

您需要覆盖单元格中的prepareForReuse。并将其从tableView:indexPath:中删除。因此,当您滚动时,将重复使用单元格,但isBottonisTop变量将被重置。

override func prepareForReuse() {
    self.isBottom = false
    self.isTop = false
}

答案 3 :(得分:1)

您可以通过在单元格中调用自定义方法来解决此问题,例如

在UIViewController中:

//.......

cell.isTop = false
if(indexPath.row == 0){
    cell.isTop = true
}

cell.isBottom = false
if(indexPath.row == myArray.count-1){
    cell.isBottom = true
}

cell.UpdateViews()

return cell
}

在TableViewCell中:

//@IBOutlet ...

var isTop: Bool?
var isBottom: Bool?

func updateViews() {
  print("result: \(self.isTop) \(self.isBottom)")
}
祝你好运!