在我的应用程序中,我有两个表视图控制器。
tableViewController1
有一个带有文字标签的行列表,并从Core Data加载一些数据,一个重要的值是' deviceid'在我的应用程序中,我几乎需要任何东西。
tableViewController2
有1-5行,具体取决于您在tableViewController1中选择的行。
我已经实现了一个原型自定义单元格,它有自己的类,并实现了标签(label2)和段控件(segment1)。
当我选择tableViewController1上的第一行时,我在tableViewController2中看到3行,因此有3个段控件。
使用协议我可以触发返回tableViewController2,段控件已更改值,但我怎么知道这三个中的哪一个被触发?
我尝试使用didSelectRowAtIndexPath但是如果用户只点击了段控件,那么就不会选中该行,因此它不会触发。
此外,如果我想传递' deviceid'从tableViewController2到原型单元格,这可能吗?我再次尝试使用该协议,但没有运气。
我正在尝试做的代码:
[编辑]我接受了输入并设法让它在不需要协议的情况下工作,但在单元级别添加了一个动作,这是“正确的”#39;这样做的方法呢?
class TableViewController1: UITableViewController {
var rowItems = ["Row 1", "Row 2", "Row 3"]
var deviceid = "123456789"
var rowToSend: Int = 0
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return rowItems.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier("CustomCell1") as! TableViewCell1
cell.label1.text = rowItems[indexPath.row]
return cell
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
rowToSend = indexPath.row
performSegueWithIdentifier("seg1", sender: self)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == "seg1") {
let theDestination = (segue.destinationViewController as! TableViewController2)
theDestination.deviceid = deviceid
theDestination.incomingRow = rowToSend
}
}
}
class TableViewController2: UITableViewController {
var deviceid = ""
var incomingRow: Int = 0
var parameterItems = ["Parameter 1", "Parameter 2", "Parameter 3"]
override func viewDidLoad() {
super.viewDidLoad()
if incomingRow < 2 {
parameterItems = ["Parameter 1", "Parameter 2", "Parameter 3"]
} else {
parameterItems = ["Parameter 1", "Parameter 4", "Parameter 5"]
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return parameterItems.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier("CustomCell2") as! TableViewCell2
cell.label2.text = parameterItems[indexPath.row]
cell.segment1.addTarget(self, action: "controlChanged:", forControlEvents: UIControlEvents.ValueChanged)
return cell
}
func controlChanged(sender: UISegmentedControl) {
let pointInTable: CGPoint = sender.convertPoint(sender.bounds.origin, toView: self.tableView)
let cellIndexPath = self.tableView.indexPathForRowAtPoint(pointInTable)
if let myRow = cellIndexPath?.row {
println("row: \(myRow) with value: \(sender.selectedSegmentIndex) for deviceid: \(deviceid)")
}
}
}
class TableViewCell2: UITableViewCell {
@IBOutlet weak var label2: UILabel!
@IBOutlet weak var segment1: UISegmentedControl!
override func awakeFromNib() {
super.awakeFromNib()
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
}
答案 0 :(得分:0)
从控件到单元格索引路径的方法如下:
func controlChanged(sender: UISegmentedControl) {
let point = sender.convertPoint(CGRectZero toView: self.tableView)
let indexPath = self.tableView(indexPathForRowAtPoint: point)
// your logic based on indexPath
}