2017-01-28 5 views
1

Я пытаюсь переместить мой просмотр только в том случае, если выбрано определенное значение textField. Тем не менее, я получил его, если теперь выбрать другой textField, он снова активируется и на других текстовых полях, почему?Переместить просмотр только в том случае, если выбран определенный текстовый фильтр

Как это я имею дело с перемещением:

func keyboardWillShow(notification: NSNotification) { 

     if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { 
      if self.view.frame.origin.y == 0{ 
       self.view.frame.origin.y -= keyboardSize.height 
      } 
     } 

    } 

    func keyboardWillHide(notification: NSNotification) { 
     if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { 
      if self.view.frame.origin.y != 0{ 
       self.view.frame.origin.y += keyboardSize.height 
      } 
     } 
    } 

И как это я пытаюсь addObserver в TextField touchDown:

@IBAction func didTapCertainTextField(_ sender: Any) { 
     NotificationCenter.default.addObserver(self, selector: #selector(CreateCardViewController.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil) 

    } 

потока в словах:

Допустим, я имеют 5 текстовых полей (1, 2, 3, 4, 5)

Я добавляю наблюдателя к третьему текстовому полю. Я нажимаю сначала, просмотр не перемещается, я нажимаю на треть, и я снова нажимаю 1, и теперь он перемещается. Зачем? Я не хочу, чтобы представление перемещалось, если щелкнуть textField равен 1.

+0

@LeoDabus Ох, хорошо. Поэтому я должен добавить его в textField? –

ответ

0

Что вы ищете, так это знать, является ли textField первым ответчиком, но то, что вы делаете, получает уведомление, когда отображается клавиатура.

Я призываю вас смотреть в этот класс какао: https://developer.apple.com/reference/uikit/uiresponder

Или вы можете в точном КАСЕ вас UITextField связывают действия с EditingDidBegin и EditingDidEnd через вас Xcode Interface Builder или сделать это программно с делегат https://developer.apple.com/reference/uikit/uitextfielddelegate

Также я могу заметить, что вы начали наблюдать за этими событиями, но мне кажется, что вы никогда не прекращаете их наблюдать. Для этого следует вызвать removeObserver: имя: объект: в какой-то момент до конца срока службы вашего объекта

0

Если я вас правильно понимаю, вы пытаетесь переместить вид только тогда, когда клавиатура скрывает UITextField , Если это так, я написал следующее расширение специально для этого:

extension UIViewController { 

    func pushViewForTextFields() { 
     // Push view according text field's position 
     NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name:NSNotification.Name.UIKeyboardWillShow, object: nil) 
     NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name:NSNotification.Name.UIKeyboardWillHide, object: nil) 
    } 

    @objc func keyboardWillShow(_ sender: Notification) { 
     var currentEditingTextField: UITextField! 
     let keyboardHeight = UIScreen.main.bounds.maxY - ((sender as NSNotification).userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.height 

     // Find which text field is currently editing (O(n)) 
     for view in self.view.subviews as [UIView] { 
      if let tf = view as? UITextField { 
       if tf.isEditing { 
        currentEditingTextField = tf 
        break 
       } 
      } 
     } 

     if currentEditingTextField == nil || currentEditingTextField < 0 { 
      // no textfield found 
      return 
     } 

     // get absolute frame of the text field, regardless of its parent view 
     let globalFrame = (currentEditingTextField.superview?.convert(senderObject.frame, to: self.view))! 

     // the 30 below is completely arbitrary; change it to whatever you want to suit your needs. This is basically the distance you want between the top of the keyboard and the editing text field (30px) 

     if globalFrame.maxY + 30 > keyboardHeight { 
      self.view.frame.origin.y = -(globalFrame.maxY + 30 - keyboardHeight) 
     } 
     else {  // keyboard not covering the text field 
      self.view.frame.origin.y = 0 
     } 

    } 

    @objc func keyboardWillHide(_ sender: Notification) { 
     // move view back to normal position when editing is done 
     self.view.frame.origin.y = 0 
    } 

} 

Тогда просто использовать его в UIViewController как этот

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.pushViewForTextFields() 
} 

Обратите внимание, что это расширение только работает, если ваши UITextField объекты находятся на верхний уровень основного UIView. т. е. если они не встроены в какие-либо подвид. Если у вас есть какое-либо текстовое поле в подвью, тогда вам придется развернуть for-loop, введя в него еще один цикл for-loop, чтобы проверить каждое представление в каждом подпункте (O (n^2) в этом случае).

Это может быть не самым эффективным способом (с циклом по дереву и все UIView «s), но я только написал это, чтобы иметь универсальное решение, которое я могу легко применить ко всем моим UIViewController сек