通过Button Swift中的标签发送行和部分

时间:2015-09-02 10:42:27

标签: ios swift uitableview button sender-id

我在 cellForRowAtIndexPath

中有这个
   cell.plusBut.tag = indexPath.row
   cell.plusBut.addTarget(self, action: "plusHit:", forControlEvents: UIControlEvents.TouchUpInside)

和外面的这个功能:

func plusHit(sender: UIButton!){
    buildings[sender.tag].something = somethingElse
}

是否可以发送indexPath.row indexPath.section或其他替代方案?

谢谢!

修改

我这样接近它:

我的自定义按钮

class MyButton: UIButton{

    var myRow: Int = 0
    var mySection: Int = 0

}

我的自定义单元格

class NewsCell: UITableViewCell{

    @IBOutlet weak var greenLike: MyButton!

在CellForRowAtIndexPath

    cell.greenLike.myRow = indexPath.row

我在这一行收到错误。

7 个答案:

答案 0 :(得分:13)

  

是否可以发送indexPath.row和indexPath.section,或者某些替代方法?

如果对部分中可能的行数施加限制,则可以将两者合并为一个数字。例如,如果您愿意说某个部分中的行总是少于1000行,您可以使用:

cell.plusBut.tag = (indexPath.section * 1000) + indexPath.row

然后使用mod和division运算符来恢复:

row = sender.tag % 1000
section = sender.tag / 1000

另一种可能性是检查按钮的超级视图(及其超级视图等),直到找到该单元格。获得单元格后,您可以从表中获取该单元格的索引路径。

第三个选项,也许是最好的选项,是让按钮以单元格而不是其他对象为目标。然后,单元格可以在视图控制器或其他对象中使用自身作为发送方触发操作。

答案 1 :(得分:4)

您可以创建UIButton的子类,并在其中创建一个额外的属性部分。然后你可以使用该类进行单元格按钮。你可以为行做同样的事。

继承UIButton

之后,有几种可能的方法
cell.plusBut.tag = indexPath.row
cell.plusBut.section = indexPath.section

或者

cell.plusBut.row = indexPath.row
cell.plusBut.section = indexPath.section

或者

cell.plusBut.indexPath = indexPath

选择适合你的任何内容。

答案 2 :(得分:2)

Swift 2.x - 与关联对象的扩展

private struct AssociatedKeys {
static var section = "section"
static var row = "row"
}

extension UIButton {
var section : Int {
    get {
        guard let number = objc_getAssociatedObject(self,   &AssociatedKeys.section) as? Int else {
            return -1
        }
        return number
    }

    set(value) {
        objc_setAssociatedObject(self,&AssociatedKeys.section,Int(value),objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    }
}
var row : Int {
    get {
        guard let number = objc_getAssociatedObject(self, &AssociatedKeys.row) as? Int else {
            return -1
        }
        return number
    }

    set(value) {
        objc_setAssociatedObject(self,&AssociatedKeys.row,Int(value),objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    }
}
}

用法:

//set
cell.contextMenuBtn.section = indexPath.section
cell.contextMenuBtn.row = indexPath.row 
//read
func showContextMenu (sender:UIButton) {
    let track = dictionarySongs[sender.section][sender.row]
    ...
}

答案 3 :(得分:0)

我建议采用另一种方法。我不喜欢子类解决方案,我不认为按钮应该知道它的位置。 为什么不使用字典将按钮转换为IndexPath

// First initialize the lookup table
var buttonPositions = [UIButton: NSIndexPath]()

// add each button to the lookup table
let b = UIButton()
let path = NSIndexPath(forItem: 1, inSection: 1)


buttonPositions[b] = path

// Looking it up works like this
buttonPostions[activeButton]?.row  

答案 4 :(得分:0)

您可以通过扩展程序为UIButton分配自定义标记,请查看:

pristine

答案 5 :(得分:0)

通过按钮发送行和部分你可以使用tag和accessibilityIdentifier,看看:

设定值

 button.tag = indexPath.row
 button.accessibilityIdentifier = "\(indexPath.section)"

获取价值

let indexRow = button.tag
let indexSection = Int(button.accessibilityIdentifier!)

答案 6 :(得分:0)

这是我使用的非常简单的解决方案:

在CellForRow中:

button.tag = indexPath.row
cell.contentView.superview?.tag = indexPath.section

在函数中按如下方式检索它:

func buttonTapped(_ sender: Any) {
    let button = sender as! UIButton
    let row = button.tag
    let sec = button.superview?.tag

    //retrieve item like self.array[sec][row]
    //do the rest of your stuff here
}