2017-02-17 57 views
0

我所做的所有工作就是在长时间触摸时调用新控制器(UILongPressGestureRecognizer)。 这里代码:尝试呈现哪个已经呈现

class ViewController: UIViewController { 

@IBOutlet weak var button: UIButton!{ 
    didSet{ 
     button.addGestureRecognizer(UILongPressGestureRecognizer(target: self, 
                   action: #selector(settingTheButton(_:)))) 
    } 
} 

func settingTheButton(_ recognizer: UILongPressGestureRecognizer){ 
    print("touchTheColorButton was called") // here the method invokes twice 
    if let button = recognizer.view as? UIButton{ 
     performSegue(withIdentifier: "setTheButtonColor", sender: button) 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?){ 
    if segue.identifier == "setTheButtonColor", let vc = segue.destination as? SettingsForButtonVC, let senderButton = sender as? UIButton { 
     vc.button = senderButton 
    } 
} 
} 

我不明白。为什么setTheButton方法调用两次?它不会干扰或伤害程序,但它真的打扰了我。

控制台: touchTheColorButton被称为 touchTheColorButton被称为 2017年2月18日01:28:12.499552测试[1042:223223]警告:试图提出在已经呈现

+0

将segue的发件人更改为self,并删除您的prepareForSegue方法的按钮。 – Mannopson

回答

1

扩展@Marco Santarossa提供的解决方案(无法评论)。这将正常工作:

func settingTheButton(_ recognizer: UILongPressGestureRecognizer){ 

    // Get the button just as you have done 
    if let button = recognizer.view as? UIButton{ 

     // Take only the `.ended` event, discarding any other ones 
     if recognizer.state == .ended { 
      performSegue(withIdentifier: "setTheButtonColor", sender: button) 
     } 
    } 
} 

的问题与您的代码是释放按钮,这是你可能期望的行为不只是当每一次,每次在UILongPressGestureRecognizer被触发的事件settingTheButton(_ recognizer:)叫。这两个事件是.began(一旦印刷机被识别为长按)和.ended(释放长按之后)。

简单地忽略这两者会使您的代码只被调用一次,另外它在.ended上更有意义,因为您可能希望在释放按钮之后出现新屏幕,而不是在按钮按下期间出现。

注意:如果您知道,最好明确地只允许.ended,因为至少有一个其他常见事件可以与我所知的那两个事件分开触发。如果您使用的是强制触摸设备,则会多次调用.changed,因为每发生一次非常轻微的压力变化,就会调用一次。

2

您的问题你没有听到手势的状态。

更改为:

func settingTheButton(_ recognizer: UILongPressGestureRecognizer){ 
    guard recognizer.state == .ended else { return } 

    print("touchTheColorButton was called") // here the method invokes twice 
    if let button = recognizer.view as? UIButton{ 
     performSegue(withIdentifier: "setTheButtonColor", sender: button) 
    } 
} 

我没有正确地测试。让我知道如果它在downvoting之前不起作用。

相关问题