【问题标题】:How can properly use 'sender' argument in @UIAction code Swift?如何在 @UIAction 代码 Swift 中正确使用 'sender' 参数?
【发布时间】:2016-04-18 17:42:32
【问题描述】:

我对 Swift 编程比较陌生,刚刚从 this article on Stack Overflow 了解到我不能通过 @IBAction 代码中的 'sender' 参数更改 UIButton 文本,但必须从按钮设置一个 @IBOutlet 并使用方法出口变量。这是多么广泛的规则?哪些方法可以应用于 'sender' 参数,哪些不可以?

【问题讨论】:

  • 用你的行动方法更新你的问题。
  • 你错了。通过sender 参数更新按钮的属性是非常好的。您链接的问题的较长答案是错误的(或至少非常令人困惑)。

标签: ios swift uibutton


【解决方案1】:

我不知道他们在您链接到的帖子中指的是什么,因为它不正确。您不需要@IBOutlet 来专门处理任何事情。它不授予按钮任何特殊权力,它只是一个方便的指针,指向您可以使用的对象。

如果你想调用对象的方法,当然需要一个指向对象的指针,但是@IBActionsender 属性对于IBAction 的代码同样适用。

您必须确保sender 是正确的类型。

例如:

@IBAction func buttonPressed(sender: UIButton) {
    sender.setTitle("New Title", forState: .Normal)
}

这样可以正常工作并更改点击的按钮。是否有@IBOutlet 指向它并不重要。 sender 变量就是您所需要的。

在某些情况下,您需要为 sender 使用 AnyObject 类型,在这种情况下,您需要先检查类型:

@IBAction func buttonPressed(sender: AnyObject) {
    if let button = sender as? UIButton {
        button.setTitle("New Title", forState: .Normal)
    }
}

现在,如果您想更改其他按钮的标题,@IBOutlet 可以更轻松。

@IBOutlet weak var someOtherButton: UIButton!

@IBAction func buttonPressed(sender: UIButton) {
    someOtherButton.setTitle("New Title", forState: .Normal)
}

但同样,@IBOutlet 不是必需的(推荐)。要显示@IBOutlet 没有任何特殊权力,您可以在 Interface Builder 中的按钮上设置 tag 值(例如 100)并使用如下代码:

@IBAction func buttonPressed(sender: AnyObject) {
    if let button = view.viewWithTag(100) as? UIButton {
        button.setTitle("New Title", forState: .Normal)
    }
}

我在这里使用的 100 数字是任意的,可以是任何数字,只要您只将数字用于视图中的一项即可。

【讨论】:

    【解决方案2】:
    @IBAction func buttonClicked(sender : AnyObject) {
    println("Button was clicked", sender)
    }
    

    这里的发件人是指您的按钮的参考。您可以使用sender.backgroundColor 等发件人在点击按钮上执行不同的操作。

    希望这会有所帮助:)

    【讨论】:

      【解决方案3】:

      您提到的 sender 参数是 Target-Action 机制的一部分。

      sender 参数通常标识发送动作消息的控件(尽管它可以是由实际发送者替代的另一个对象)。这背后的想法类似于明信片上的寄信人地址。如果需要,目标可以向发送者查询更多信息。如果实际的发送对象替换为另一个对象作为发送者,您应该以相同的方式处理该对象。例如,假设您有一个文本字段,当用户输入文本时,将在目标中调用操作方法 nameEntered::

      由于发件人可以被替换,如果手动调用它,则无法保证有人可以在参数中使用另一个发件人,而如果您通过 IBOutlet 在您的类中拥有对您的按钮的引用,那么它有时可能是更明智地将它用于您希望调用的任何方法,因为您确定它指的是按钮。

      但是,如果您确定该方法仅与正确的发件人相关联,则您可能会调用任何方法。

      问题不是“我可以调用什么操作”而是“我真的确定发件人确实是相关按钮”

      【讨论】:

      • 这根本不能回答问题。
      • 谢谢,我完全误解了这个问题。编辑了我的答案。
      猜你喜欢
      • 2019-11-27
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 2018-08-15
      • 1970-01-01
      • 2020-08-12
      • 2022-10-16
      相关资源
      最近更新 更多