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

问题描述 投票:0回答:8

我里面有这个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

我在这一行遇到错误。

ios swift uitableview button sender-id
8个回答
20
投票

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

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

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

然后使用取模和除法运算符来恢复:

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

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

第三种选择,也许是最好的一种,是让按钮定位单元格而不是其他对象。然后,单元格可以使用自身作为发送者来触发视图控制器或其他对象中的操作。


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

选择适合你的。


3
投票

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

在 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
}

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]
    ...
}

1
投票

通过Button发送Row和Section可以使用tag和accessibilityIdentifier,看一下:

设定值

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

获取价值

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

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  

0
投票

您可以通过扩展为 UIButton 分配自定义标签,看一下:

extension UIButton {

private struct ButtonTag {

    static var tagKey = "key"

}

var myTag : (Int , Int)? {

    set  {
        if let value = newValue {
            objc_setAssociatedObject(self, &ButtonTag.tagKey, value as! AnyObject, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }

    get {
        return objc_getAssociatedObject(self, &ButtonTag.tagKey) as? (Int , Int)
    }
  }   
}

0
投票

这个问题有一定可能的解决方案:

解决方案1:

  1. 创建 UIButton 的子类:
class CustomTaggedButton: UIButton {
   var section: Int = 0
   var row: Int = 0
}
  1. 将 CustomTaggedButton 分配给您的按钮。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "CellIdentifier", for: indexPath) as! CustomTableViewCell

    cell.button.section = indexPath.section
    cell.button.row = indexPath.row
    button.setTitle("Tap me", for: .normal)
    button.addTarget(self, action: #selector(buttonTapped(_:)), for: .touchUpInside)
    
    return cell
}
  1. 单击按钮
func buttonTapped(_ sender: CustomTaggedButton) {
    let section = sender.section
    let row = sender.row
    
    print("Button tapped - Section: \(section), Row: \(row)")
    
    // Use section and row as needed
}

解决方案2: https://stackoverflow.com/a/32352839/4257067这个特定答案的逻辑或有意义的解决方案。

使用移位和按位运算的组合将节和行信息打包到单个标签值中。

  1. 分配标签时:
let tag = (indexPath.section << 16) | indexPath.row
cell.button.tag = tag
  1. 提取节和行时:
func buttonTapped(_ sender: UIButton) {
    let tag = sender.tag
    let section = (tag >> 16) & 0xFFFF
    let row = tag & 0xFFFF
        
    print("Button tapped - Section: \(section), Row: \(row)")
    
    // Use section and row as needed
}

部分和行的示例标记值:

Tag for Section 0, Row 0: tag = (0 << 16) | 0 = 0
Tag for Section 1, Row 2: tag = (1 << 16) | 2 = 65538
Tag for Section 2, Row 3: tag = (2 << 16) | 3 = 131075
© www.soinside.com 2019 - 2024. All rights reserved.