2017-02-17 5 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-02-18 01: 28: 12.499552 тест [1042: 223223] Внимание: Попытка представить, на котором уже представляя

+0

Измените отправителя segue на себя и удалите кнопку метода 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) 
     } 
    } 
} 

Проблема с кодом, что settingTheButton(_ recognizer:) вызывается один раз за каждый раз, когда событие происходит в UILongPressGestureRecognizer, а не только при отпускании кнопки, которая является поведением, которое вы, вероятно, ожидать. Два события: .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.