2017-02-17 56 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之前不起作用。

相關問題