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
课程。
答案 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