Ios UISwitch-UITableView

Ios UISwitch-UITableView,ios,swift,uitableview,uiswitch,Ios,Swift,Uitableview,Uiswitch,我有这个桌面视图: 但我无法识别用户何时选择行中的UISwitch。 我知道我需要在UITableViewCell类中使用@iAction,但我没有找到适合我的指南。 我想在用户单击UISwitch时打印行的indexPath 这是我的手机课程: class TicketsFilterCell: UITableViewCell { @IBOutlet weak var textFilter: UILabel! @IBOutlet weak var switchFilter: UISwitc

我有这个桌面视图:

但我无法识别用户何时选择行中的UISwitch。 我知道我需要在UITableViewCell类中使用@iAction,但我没有找到适合我的指南。 我想在用户单击UISwitch时打印行的indexPath

这是我的手机课程:

class TicketsFilterCell: UITableViewCell {


@IBOutlet weak var textFilter: UILabel!
@IBOutlet weak var switchFilter: UISwitch!


class var reuseIdentifier: String? {
    get {
        return "TicketsFilterCell"
    }
}

override func awakeFromNib() {
    super.awakeFromNib()
}

override func setSelected(selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

}

}
我该怎么办

提前谢谢

编辑

My cellForRowAtIndexPath:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{

    let cell: TicketsFilterCell? = tableView.dequeueReusableCellWithIdentifier("cellTicketFilter", forIndexPath: indexPath) as? TicketsFilterCell

    cell?.delegate = self

    if(indexPath.section == 0) {

        let text = status[indexPath.row]?.capitalizedString

        cell?.textFilter.text = text


    } else if(indexPath.section == 1) {

        let text = queues [indexPath.row]?.capitalizedString

        cell?.textFilter.text = text

    } else if(indexPath.section == 2) {

        let text = types[indexPath.row]?.capitalizedString

        cell?.textFilter.text = text

    } else if(indexPath.section == 3) {

        let text = severities[indexPath.row]?.capitalizedString

        cell?.textFilter.text = text

    }



        return cell!

}
吉根

以下是您可以做的:)

在cell类中声明一个协议,让我们将其称为CellProtocol

protocol CellProtocol : class {
    func switchButtonTapped(WithStatus status : Bool, ForCell myCell : TicketsFilterCell)
}
在TicketsFilterCell类中声明一个变量以保存委托

weak var delegate : CellProtocol!
当用户点击您的开关时,将触发代理作为

override func setSelected(selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)
    self.delegate .switchButtonTapped(WithStatus: selected, ForCell: self)
}
在TableViewController中,使用确认协议

class ViewController: UITableViewController,CellProtocol {
现在,在ViewController的cellForRoAtIndexPath中,为每个单元格将代理设置为self

cell.delegate = self
最后实现委托方法,如下所示

func switchButtonTapped(WithStatus status: Bool, ForCell cell: TicketsFilterCell) {
        let indexPath = self.tableView .indexPathForCell(cell)
        print("cell at indexpath \(indexPath) tapped with switch status \(status)")
    }
编辑:

对于已为开关拖动IBOutlet的每个单元格:),现在只需将iAction从UISwitch拖动到单元格:)

就是这样:)

用这个

cell.yourSwitch.tag=indexPath.row;
单元格中,按索引路径方法


根据该标记,在“打开/关闭”操作中执行代码。

将开关中的
@IBAction
添加到视图控制器本身。在iAction函数中,将发送器的位置转换为tableView的框架。然后,在tableView中找到该点的单元格

我相信这是向表视图单元格添加操作的最优雅的方式

  • tag属性的最大问题是,它的使用一开始总是很简单,但随着时间的推移,逻辑(或缺乏逻辑)会演变成一团无法阅读的混乱
  • 这比创建协议和实现委托更容易
下面是连接到交换机的
值已更改的
操作的
iAction

@IBAction func switchValueChanged(sender: AnyObject) {
    let switchButton = sender as! UISwitch
    let buttonPosition = switchButton.convertPoint(CGPointZero, toView: self.tableView)
    let indexPath = self.tableView.indexPathForRowAtPoint(buttonPosition)!
    NSLog("switch at index %d changed value to %@", indexPath.row, switchButton.on)
}

iAction
中,获取发送方(开关)的
superview
,它是表视图单元格。然后获取索引路径。@vadian谢谢!我会试试这个。谢谢,我会试试。@jigen:当然,伙计:)在协议中,myCell是什么意思?@jigen:对不起,myCell是cells类的名称,在您的情况下,它将是TicketsFilterCell:)好的,我试过了,但我在弱var委托:CellProtocol!上没有!。我解决了设置“协议CellProtocol:class{…}”的问题@jigen:您是否将CellForRowatineXpath中的单元格委托设置为cell.delegate=self???
@IBAction func switchValueChanged(sender: AnyObject) {
    let switchButton = sender as! UISwitch
    let buttonPosition = switchButton.convertPoint(CGPointZero, toView: self.tableView)
    let indexPath = self.tableView.indexPathForRowAtPoint(buttonPosition)!
    NSLog("switch at index %d changed value to %@", indexPath.row, switchButton.on)
}