簡體   English   中英

如何獲取當前活動的UITextField / UITextView和resignFirstResponder?

[英]How to get the currently active UITextField/UITextView and resignFirstResponder?

是否可以在UIView中獲取當前活動的UITextField或UITextView,所以我可以使用[text resignFirstResponder];隱藏鍵盤[text resignFirstResponder];

從iOS 2.0及更高版本開始,有一種簡單的方法可以關閉鍵盤,而不必跟蹤當前活動的控件,或遍歷所有可用控件,或使用UITextFieldDelegate

[self.view endEditing:YES]

從文檔:

endEditing:

使視圖(或其嵌入式文本字段之一)退出第一響應者狀態。

-( BOOL )endEditing :( BOOL強制

參量

指定YES以強制第一響應者辭職,無論它是否願意這樣做。

返回值
如果視圖放棄了第一響應者狀態,則為YES否則,則為NO

討論區
此方法查看當前視圖及其子視圖層次結構中當前是第一響應者的文本字段。 如果找到一個,它將要求該文本字段辭去第一響應者的職務。 如果將force參數設置為YES ,則永遠不會詢問文本字段; 它被迫辭職。

此快速代碼可用於查找第一個響應者:

func findActiveResponderFrame(view:UIView)->UIView?{
  if view.isFirstResponder() {
    return view
  } else {
    for sub in view.subviews {
      if let subView = sub as? UIView,
             found = findActiveResponderFrame(subView){
        return found
      }
    }
  }
  return nil
}

如果沒有單獨測試它們,就無法直接獲得當前的第一響應者(至少我知道)是什么對象。 您可以做的是創建一個包含所有子視圖的方法,可以將其視為活動的第一響應者,如下所示:

- (void)dismissKeyboard {
    if (myTextField1.isFirstResponder) {
        [myTextField1 resignFirstResponder];
    }
    else if (myTextField2.isFirstResponder) {
        [myTextField2 resignFirstResponder];
    }
    else if (myTextField3.isFirstResponder) {
        [myTextField3 resignFirstResponder];
    }
    else if (myTextField4.isFirstResponder) {
        [myTextField4 resignFirstResponder];
    }
}

但是,實際上,我傾向於以這種方式進行操作,而不先測試特定的UIView是否是當前的第一響應者,並且不認為有任何明顯的性能問題(無論如何,我已經注意到):

- (void)dismissKeyboard {
    //Send resignFirstResponder message to all possible first responders...
    [myTextField1 resignFirstResponder];
    [myTextField2 resignFirstResponder];
    [myTextField3 resignFirstResponder];
    [myTextField4 resignFirstResponder];
}

希望有幫助...

Swift 3更新

此功能可隱藏Swift 3中任何活動文本字段的鍵盤:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.view.endEditing(true)
}

類似的問題在這里發布。 我寫了一個基本的表單創建庫來處理和驗證。 它叫做Swift POP Form 它不使用tags ,而是設置一個包含字段的數據源,並使用indexPathForCell來查詢哪個是活動文本字段。 查看更多源代碼!

編輯:或按要求從這里摘錄。 此表單使用嵌入在UITableViewCells UITextFields

extension PopFormViewController: UITextFieldDelegate {

  func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    guard let cell = textField.superview as? PopFormTableViewCell else {
      fatalError() }

    guard let currentIndex = tableView.indexPath(for: cell) else {
      fatalError("cell does not exist") }

    let nextIndex = IndexPath(row: currentIndex.row + 1, section: currentIndex.section)
    let isLastField = viewModel.dataSource.fields.count == nextIndex.row

    if isLastField {
      cell.textField.resignFirstResponder()
      if shouldValidateOnLastFieldReturnKeyTap {
        validator.validate(self)
      }
      return true
    }

    guard let nextCell = tableView.cellForRow(at: nextIndex) as? PopFormTableViewCell else {
      fatalError() }

    nextCell.textField.becomeFirstResponder()
    return true
  }
}

如果您特別想獲取響應者文本字段,則可以關注。 在不使用私有API的情況下獲取當前的第一響應者

如果您只想關閉活動的文本字段鍵盤,也可以使用以下代碼-

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
   [textField resignFirstResponder];
   return YES;
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM