【问题标题】:UILongPressGestureRecognizer access the button being clickedUILongPressGestureRecognizer 访问被点击的按钮
【发布时间】:2014-12-17 23:33:51
【问题描述】:

我设置了一个 UILongPressGestureRecognizer 来处理视图中的四个不同按钮,我如何访问在我的代码中单击了哪个按钮?

我的 UILongPressGestureRecognizer 看起来像这样:

@IBAction func editText(sender: UILongPressGestureRecognizer) {
        textFieldInput.hidden = false
        iphoneSaveCharName.hidden = false
      }

我想使用长按来编辑按钮文本

编辑 1:

import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var iphoneTableView: UITableView!
    @IBOutlet weak var textFieldInput: UITextField!
    @IBOutlet weak var iphoneSaveCharName: UIButton!
    @IBOutlet weak var charOne: UILabel!
    @IBOutlet weak var charTwo: UILabel!
    @IBOutlet weak var charTree: UILabel!
    @IBOutlet weak var charFour: UILabel!
    @IBOutlet weak var test1: UIButton! //button that I am clicking on!



    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    //Function I made so I can save the user input
    @IBAction func iphoneSaveTextInput(sender: UIButton) {
        let textData = textFieldInput.text
        textFieldInput.hidden = true
        iphoneSaveCharName.hidden = true
        charTwo.text = textData

    }

    // This is the LongPress Action
    @IBAction func editText(sender: UILongPressGestureRecognizer) {
        textFieldInput.hidden = false
        iphoneSaveCharName.hidden = false

        func longPressMethod(gesture: UILongPressGestureRecognizer) {

            println(gesture.view)

            if gesture.view is UIButton {

                let test1 = gesture.view as UIButton
                println(test1)
            }
        }

    }
}

编辑 2:Layout

编辑 3:新视图控制器

 import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var iphoneTableView: UITableView!
    @IBOutlet weak var textFieldInput: UITextField!
    @IBOutlet weak var iphoneSaveCharName: UIButton!
    @IBOutlet weak var charOne: UIButton!
    @IBOutlet weak var charTwo: UIButton!
    @IBOutlet weak var charThree: UIButton!
    @IBOutlet weak var charFour: UIButton!




    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func iphoneSaveTextInput(sender: UIButton) -> Void{

        let textData = textFieldInput.text
        textFieldInput.hidden = true
        iphoneSaveCharName.hidden = true
    }

    @IBAction func editText(sender: AnyObject) {
        if sender is UILongPressGestureRecognizer &&
            sender.state == UIGestureRecognizerState.Began {

                textFieldInput.hidden = false
                iphoneSaveCharName.hidden = false

//                func iphoneSaveTextInput(sender: UIButton){
//                    var textData = textFieldInput.text
//                    textFieldInput.hidden = true
//                    iphoneSaveCharName.hidden = true
//                
//                }

                let button = sender.view as UIButton
                println(button)

                if button.tag == 1{
                    charOne.setTitle("textData", forState: .Normal)
                } else if button.tag == 2{
                    charTwo.setTitle("textData2", forState: .Normal)
                } else if button.tag == 3{
                    charThree.setTitle("textData3", forState: .Normal)
                } else if button.tag == 4{
                    charFour.setTitle("textData4", forState: .Normal)
                }
        }
    }
}

答案:

这是最终的视图控件:

import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var iphoneTableView: UITableView!
    @IBOutlet weak var textFieldInput: UITextField!
    @IBOutlet weak var iphoneSaveCharName: UIButton!
    @IBOutlet weak var charOne: UIButton!
    @IBOutlet weak var charTwo: UIButton!
    @IBOutlet weak var charThree: UIButton!
    @IBOutlet weak var charFour: UIButton!




    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func iphoneSaveTextInput(sender: UIButton) -> Void{

        let textData = textFieldInput.text
        textFieldInput.hidden = true
        iphoneSaveCharName.hidden = true
    }


    @IBAction func editText(sender: AnyObject) {
        if sender is UILongPressGestureRecognizer &&
            sender.state == UIGestureRecognizerState.Began {

                textFieldInput.hidden = false
                iphoneSaveCharName.hidden = false

//                func iphoneSaveTextInput(sender: UIButton){
//                    var textData = textFieldInput.text
//                    textFieldInput.hidden = true
//                    iphoneSaveCharName.hidden = true
//                
//                }

                let button = sender.view as UIButton
                println(button)

                if button.tag == 1{
                    charOne.setTitle("textData", forState: .Normal)
                } else if button.tag == 2{
                    charTwo.setTitle("textData2", forState: .Normal)
                } else if button.tag == 3{
                    charThree.setTitle("textData3", forState: .Normal)
                } else if button.tag == 4{
                    charFour.setTitle("textData4", forState: .Normal)
                }
        }
    }
}

我最想给大家一个最好的答案,因为每个人都帮助了我!我必须为每个按钮创建一个长按,否则代码会混淆。

【问题讨论】:

  • 你是如何设置手势识别器的?
  • 为什么按钮需要UILongPressGestureRecognizer
  • 目前还不清楚为什么要向按钮添加长按手势识别器。您不需要它来编辑按钮文本。您应该说明您要完成的工作,以便我们提供更好的解决方案。
  • re: 编辑 1. 这不是我的意思...我不是要把 func 放在另一个里面...但是如果你确实把一个函数放在另一个里面,你实际上必须调用该内部函数以使其执行...我将更新我的答案以符合您当前的代码。
  • 用户应该能够在按钮上编辑标签。该按钮必须起作用,如果您按住单击将编辑标签,但如果您单击将打开另一个视图

标签: ios xcode swift uiviewcontroller storyboard


【解决方案1】:

您的问题向我介绍了一个非常酷的功能,非常感谢! :)

事实证明,如果您将 UILongPressGestureRecognizer 附加到情节提要中的 UIButton 并将该按钮 手势附加到 swift 类中的 IBAction,则 IBAction 方法可以识别触摸是轻敲还是长按!很酷吧?

首先,确保每个UIButton 都有自己独特的UILongPressGestureRecognizer;然后您可以像这样编辑您的代码,以便它能够识别正在按下哪个按钮以及该按下是简单的点击还是UILongPressGestureRecognizer

// Connect both your button *and* its gestures to the
// `IBAction` method so that the function will be called
// no matter what kind of gesture it recognizes -- tap, 
// long press, or otherwise.
@IBAction func buttonSelected(sender: AnyObject) {

    // But to see if the gesture is a long press, you can
    // simply check the sender's class and execute the code
    // when the gesture begins.
    if sender is UILongPressGestureRecognizer &&
        sender.state == UIGestureRecognizerState.Began {

        // These two lines are originally from your
        // editText method
        textFieldInput.hidden = false
        iphoneSaveCharName.hidden = false

        // Then to identify which button was long pressed you
        // can check the sender's view, to see which button IBOutlet
        // that gesture's view belongs to.

        // Method #1:

        let button = sender.view as UIButton

        if button == thisButton {

        } else if button == thatButton {

        }
        ...

        // Or you can check the gesture view's tag to see which
        // button it belongs to (i.e. whichever button has a matching
        // tag).

        // Method #2:

        let button = sender.view as UIButton

        if button.tag == 1 {

        } else if button.tag == 2 {

        }
        ...
    }

    // Else if it's not a long press gesture, perform
    // whatever action you'd like to accomplish during a
    // normal button tap
    else if !(sender is UILongPressGestureRecognizer) {

        // These lines are originally from your
        // iphoneSaveTextInput
        let textData = textFieldInput.text
        textFieldInput.hidden = true
        iphoneSaveCharName.hidden = true

    }
}

但是如果您想继续将UILongPressGestureRecognizer IBActionUIButtonIBAction 分开(即将UIButtons 链接到iphoneSaveTextInput: 并将您的UILongPressGestureRecognizers 链接到@987654336 @),那也应该没问题。保持你的 iphoneSaveTextInput: 方法不变,然后像这样更新你的 editText: 方法:

// This is the LongPress Action
@IBAction func editText(sender: UILongPressGestureRecognizer) {

    if sender.state == UIGestureRecognizerState.Began {

        textFieldInput.hidden = false
        iphoneSaveCharName.hidden = false

        // Then to identify which button was long pressed you
        // can check the sender's view, to see which button IBOutlet
        // that gesture's view belongs to.

        // Method #1:

        let button = sender.view as UIButton

        if button == thisButton {

        } else if button == thatButton {

        }
        ...

        // Or you can check the gesture view's tag to see which
        // button it belongs to (i.e. whichever button has a matching
        // tag).

        // Method #2:

        let button = sender.view as UIButton

        if button.tag == 1 {

        } else if button.tag == 2 {

        }
        ...

    }
}

【讨论】:

  • 你给我的代码我无法执行,我把我的ViewController贴给你看
  • @Skal 你在说什么? “这是我的控制视图:”
  • 对不起,我以为它会跳过一行并意外发布了它。
  • @Skal 不用担心。无论如何,我将使用您当前的代码更新我的答案。
  • 嗨,你在这里帮助我,但无论如何,欢迎你哈哈哈!但还有一件事,在“let sender = gesture.view as UIButton”中指出手势是一个未解析的标识符,我应该用它代替什么吗?
【解决方案2】:

您不想在不同的视图中使用相同的手势识别器:

Can you attach a UIGestureRecognizer to multiple views?

手势识别器的view 属性可能是您想要检查的,但您希望每个视图都有不同的手势识别器。

但是,如果您愿意,它们都可以链接到同一个选择器,并且您可以通过这种方式访问​​传入识别器的视图。

【讨论】:

    【解决方案3】:

    根据您按下按钮的时间长短,使按钮具有不同操作的一般方法,如下所示(计时器是一个属性),

    @IBAction func buttonDown(sender: UIButton) { // connected to touchDown
           timer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: "handleTimer", userInfo: sender, repeats: false)
        }
    
    
        @IBAction func buttonUp(sender: UIButton) { // connected to touchUpInside
            if timer != nil {
                timer.invalidate()
                println("change view")
            }
        }
    
    
        func handleTimer() {
            var button = timer.userInfo as UIButton
            timer = nil
            button.setTitle("New Title", forState: .Normal)
        }
    

    【讨论】:

    • 很好的答案。但是请查看我的以了解我刚刚通过测试发现的一个非常酷的 Swift 特定功能! (显然我对这个“发现”太兴奋了。)
    • @LyndseyScott,讨厌让你破灭,但 Swift 并没有什么特别之处——如果你将一个按钮和一个长按识别器连接到同一个方法,你会在 Objective-C 中得到相同的结果。不过,这是一种有趣的方式来覆盖按钮的正常操作方法。
    • 哦,我在 Obj-C 中尝试过,但由于某种原因它对我不起作用……但仍然很酷。
    • 无论如何,我觉得我的“发现”是 OP 使用带有 UILongPressGestureRecognizer 参数的 IBAction 的初衷。
    猜你喜欢
    • 1970-01-01
    • 2018-03-07
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    相关资源
    最近更新 更多