【问题标题】:Pass multiple parameters to addTarget向 addTarget 传递多个参数
【发布时间】:2016-02-03 13:02:14
【问题描述】:

在我的UITableViewCell 中有一个按钮。我想通过在cellForRowAtIndexPath 方法中传递多个参数来为其添加操作。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("CartCell", forIndexPath:
        indexPath) as! CartTableViewCell
    cell.buyButton.addTarget(self, action: self.buyButton(indexPath, 2, 3 ,4 , 5, 6), forControlEvents: .TouchUpInside)
}

【问题讨论】:

  • 不,你不能这样做。该操作不是闭包,它是一个选择器,选择器必须采用 0 或 1 个参数,即发送者按钮。与其在cellForRowAtIndexPath 中向按钮添加操作,不如定义一个协议并将视图控制器设置为单元格委托。
  • 你能举个例子吗
  • 您可以使用此答案中提供的有关 UIButton 并将多个参数传递给其选择器的解决方案:stackoverflow.com/a/53779104/5324541

标签: ios swift uitableview


【解决方案1】:

如果您需要传递字符串,只需使用 UIButton 的accessibilityHint。

Tag 只能存储 Int 所以如果有人想传递字符串数据可以使用它。但是,这不是传递数据的正确方式!

示例:

button.accessibilityHint = "your string data"
button.addTarget(self, action: Selector(("buttonTapped")), for: UIControlEvents.touchUpInside)

func buttonTapped (sender: UIButton) {
   let section = sender.accessibilityHint
}

【讨论】:

  • 创意黑客,让我傻笑。谢谢
  • 不,不要使用辅助功能提示。盲人用户使用它来确定哪些视图是 VoiceOver。但是,您可以使用可访问性标识符。这仅由您的应用程序使用。 (一些测试框架,如 KIF 可以使用可访问性标识符来查找用于测试目的的字段,但这是一种不常见的情况。
【解决方案2】:

您可以使用 UIButtons 的 titleLabelUIImageView 上的 tag 属性来添加其他参数

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{
let cell = tableView.dequeueReusableCellWithIdentifier("CartCell", forIndexPath:indexPath) as! CartTableViewCell
cell.buyButton.tag = (indexPath.section*100)+indexPath.row
cell.buyButton.imageView.tag = 2
cell.buyButton.titleLabel.tag = 3
cell.buyButton.addTarget(self, action: "btnBuy_Click:", forControlEvents: .TouchUpInside)
}

【讨论】:

    【解决方案3】:

    我认为我们应该很好地构建代码。黑客只会使您的代码难以理解和错误。这里有一些建议。

    制作自定义按钮类

    class CustomButton:UIButton {
    var name:String = ""
    var object:MyObjectClassType?
    
    convenience init(name: String, object: MyObjectClassType) {
       self.init(frame:CGRectZero)
       self.name =name
       self.object = object!
    }}
    

    现在将目标添加到您的按钮

    let btn = your custom button
    btn.name = “Your name”
    btn.object = any object
    btn.addTarget(self, action: #selector(myMethod(_:)), forControlEvents:.TouchUpInside)
    

    现在只需在方法调用中获取您的值

      @IBAction func myMethod(sender:CustomButton) {
        print(sender.name)
    }
    

    【讨论】:

    • 这是一个巧妙的解决方案,您认为您可以通过 IB 实现吗?
    • @OhadM 这将是相同的流程.. 除了情节提要中连接的 UIButton 类类型可以更改为 CustomButton.. init() / init?(coder aDecoder: NSCoder) 和 awakeFromNib( ) 方法将在加载之前在 CustomButton 类上调用,但是当您准备好值时,您始终可以设置变量。就像在这种情况下,在表视图委托调用之前
    • 听起来不错,但我仍然缺少一些部分,如果我们要按照您所说的那样创建自定义按钮,我们将不得不在实际点击之前设置名称和对象属性?如果按钮位于单元格内并且我正在使用响应者链接收 VC 内的操作,我们如何使用您的想法来实现呢?我们应该如何在这个用例中设置属性?您是否有机会编辑答案并添加代码片段或示例?谢谢:)
    【解决方案4】:

    简单!

    1:子类UIButton

    class IndexPathCellButton: UIButton {
        var indexPath:NSIndexPath?
    }
    

    2:设定你的价值:

    ...
    cell.indexPathButton.addTarget(self, action: #selector(LocationSearchViewController.cellOptionButtonClick(_:)), forControlEvents: .TouchUpInside)
    cell.indexPathButton.indexPath = indexPath // Your value
    ...
    

    3:检索你的价值:

    @objc private func cellOptionButtonClick(sender: IndexPathCellButton) {
        print(sender.indexPath)
    }
    

    【讨论】:

      【解决方案5】:

      也许你可以做这样的事情

      func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
      
          let cell = tableView.dequeueReusableCellWithIdentifier("CartCell", forIndexPath:indexPath) as! CartTableViewCell
          cell.buyButton.tag = (indexPath.section*100)+indexPath.row
          cell.buyButton.addTarget(self, action: "btnBuy_Click:", forControlEvents: .TouchUpInside)
      }
      
      func btnBuy_Click(sender: UIButton) {
              //Perform actions here
           let section = sender.tag / 100
           let row = sender.tag % 100
           let indexPath = NSIndexPath(forRow: row, inSection: section)
           self.buyButton(indexPath, 2, 3 ,4 , 5, 6)
      }
      

      根据您的要求创建标签值并保持其完整性。

      【讨论】:

      • 这是一个荒谬的 hack。它有效,但它是超级hacky
      • 好主意,谢谢:),但是当我有 100 个部分和 100 行时完全错误,如果我在第 100 个部分选择第 100 行,则所选部分变为零,行变为 100。
      • 好吧,也许您可​​以使用 1000 而不是 100。我认为没有人想显示 1000 行。
      • 如果函数中有多个参数怎么办。 #selector 会是什么样子。 func btnBuy_Click(sender: UIButton, title: String).
      猜你喜欢
      • 1970-01-01
      • 2014-06-02
      • 2018-10-12
      • 1970-01-01
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 2014-10-27
      • 1970-01-01
      相关资源
      最近更新 更多