【问题标题】:Send Row and Section through Tag in Button Swift通过 Button Swift 中的标签发送行和节
【发布时间】:2015-11-27 20:03:20
【问题描述】:

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


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 多么好的解决方案......我也试图按照这些思路做一些事情。显然,section 和 row 都被假定为整数
    • 请原谅这个问题,但我不明白。如果部分是 2,我乘以 1000 并添加行,例如 5,我将得到 2005。如果我除以 1000,我将得到 2.005,即 2。正确。但是行?
    • @Markus 如果sender.tag 是2005,那么row = sender.tag % 10002005 % 1000 是5。% 是模运算符,它给出了将第一个操作数除以第二个操作数后的余数。 2005 / 1000 = 2, remainder 5,所以 2005 % 1000 是 5。
    • @Markus 另请注意,由于我们谈论的是整数,所以 2005 / 1000 = 2,而不是 2.005。
    • 是的,是的,当然。我知道 0.005 小数被四舍五入为 0,因为它是 0.005 并且变量是整数。我不太明白的是“%1000”操作。
    【解决方案2】:

    您可以创建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
    }
    

    【讨论】:

    • 我觉得第二行代码应该换成cell.button.superview?.tag = indexPath.section,否则会显示0段。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      设定值

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

      获取价值

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

      【讨论】:

        【解决方案6】:

        我建议另一种方法。我不喜欢子类解决方案,我认为按钮不应该知道它的位置。 为什么不用字典把按钮翻译成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  
        

        【讨论】:

          【解决方案7】:

          您可以通过扩展为 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)
              }
            }   
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-11-26
            • 1970-01-01
            • 2014-12-25
            • 2013-07-10
            • 2016-07-16
            • 1970-01-01
            • 2019-02-10
            • 1970-01-01
            相关资源
            最近更新 更多