将数据传递到自定义UITableViewCell类

时间:2016-06-07 08:17:51

标签: ios swift

ViewControllerA将推送到ViewControllerB。 ViewcontrollerB是UITableView,其具有在加载时注册的自定义UITableViewCell

这是我的自定义UITableViewCell

override func awakeFromNib() {
        super.awakeFromNib()
    // Here is me attempting to pass my data from my view controller
    someButton.text = stringFromViewController
}

这是我的UITableView

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let customCell = CustomCell()
    customCell.stringFromViewController = "Some Text"
    self.performSegueWithIdentifier("ViewControllerB", sender: nil)    
}

每当我尝试这个时,string都会变为空。我不确定这是否与我尝试将此数据传递到UITableViewCell而不是包含自定义UITableView的{​​{1}}这一事实有关。我想将数据传递到我的自定义cell课程。

5 个答案:

答案 0 :(得分:1)

你以错误的方式解决这个问题。 你的tableView在加载控制器B时自动重新加载。 您应该使用tableView:CellForRow:方法将数据传递给单元格。 一旦从控制器A分配值,您也可以调用tableView.reloadData()。 这是一个例子:

class ControllerB {
  var tableView: UITableView! //IBOutlet?
  var stringFromA: String? {
      didSet {
        self.tableView.reloadData()
      }
 }

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("UITableViewCell")
    cell.stringFromA = self.stringFromA
    return cell
}

答案 1 :(得分:0)

因为awakeFromNib()甚至在您初始化cell之前就会启动。

而不是在此方法中指定它,请在didSelectRowAtIndexPath

中使用它
let customCell = CustomCell()

customCell.someButton.setText("Some Text", forState: .Normal)

self.performSegueWithIdentifier("ViewControllerB", sender: nil) 

答案 2 :(得分:0)

我对您的问题的理解是,点击View Controller A中的一行会推送View Controller B,并且您希望将一些数据传递到View Controller B中的自定义单元格。您必须使用prepareForSegue来传递数据。

在视图控制器b中,设置一个变量,在你的情况下,设置一个bool。

class ViewControllerB {

var boolValue: Bool?

}

然后在didSelectRowAtIndexPath ViewControllerA中执行segue

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

self.performSegueWithIdentifier("ViewControllerB", sender: nil)    
}

然后,您必须根据所选行

执行prepareForSegue
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    // Get the new view controller using segue.destinationViewController.
    // Pass the selected object to the new view controller.

    if segue.identifier == "ViewControllerB" {
        //if you need to know which row is select, use indexPath.row
        if let indexPath = tableView.indexPathForSelectedRow {
            let controller = segue.destinationViewController as! ViewControllerB
            //send the details that you want, i.e
            if indexPath.row < 5 {
                controller.boolValue = true
            } else {
                controller.boolValue = false
            }
        }
    }

调用segue后,您将数据传递到prepareForSegue,然后您可以使用cellForRowAtIndexPath方法将信息传递给单元格。

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("CustomCell", forIndexPath: indexPath) as! CustomTableViewCell
        //pass the boolValue from viewcontrollerB to anotherBoolValue in custom cell
        cell.anotherBoolValue = boolValue

    // Configure the cell...

    return cell
}

答案 3 :(得分:0)

我同意@Lirik

在您控制器B的属性上有一个属性观察者并重新加载表格视图,然后在cellForRowAtIndexPath(::)中 将出列的单元格转换为您的自定义单元格类型,以便您可以访问单元格的所有功能

let cell:CustomCell = tableView.dequeueReusableCellWithIdentifier("UITableViewCell") as! CustomCell

cell.someBotton.text = stringFromViewControllerA

答案 4 :(得分:0)

我同意@Lirik

在您的controllerB上有一个属性观察者并重新加载表格视图,然后在cellForRowAtIndexPath(::)

将出列的单元格强制转换为自定义单元格类型,以便您可以访问单元格的所有功能

let cell:CustomCell = tableView.dequeueReusableCellWithIdentifier("UITableViewCell") as! CustomCell