Swfit:Tableview将值传递给Prototype Cell并找到触发控件的行

时间:2015-05-09 11:45:03

标签: ios uitableview swift

在我的应用程序中,我有两个表视图控制器。

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)

    }
}

1 个答案:

答案 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
}