Iphone 如何获取当前活动的UITextField/UITextView并辞职FirstResponder?
是否可以在UIView中获取当前活动的UITextField或UITextView,以便我可以使用Iphone 如何获取当前活动的UITextField/UITextView并辞职FirstResponder?,iphone,ios,cocoa-touch,uiview,Iphone,Ios,Cocoa Touch,Uiview,是否可以在UIView中获取当前活动的UITextField或UITextView,以便我可以使用[text resignFirstResponder]隐藏键盘?如果您特别想获取响应者文本字段,则可以遵循以下步骤。 如果您只想关闭活动文本字段键盘,还可以使用以下代码- - (BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; } 如
[text resignFirstResponder]隐藏键盘代码>?如果您特别想获取响应者文本字段,则可以遵循以下步骤。
如果您只想关闭活动文本字段键盘,还可以使用以下代码-
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return YES;
}
如果不单独测试,就无法直接获得当前第一响应者是什么对象(至少我知道)。您可以创建一个包含所有子视图的方法,这些子视图可能是活动的第一响应者,如下所示:
- (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是否是当前的第一响应者,也不认为存在任何明显的性能问题(我已经注意到):
希望这有助于……从iOS 2.0及更高版本开始,有一种简单的方法可以关闭键盘,而无需跟踪当前活动的控件,或遍历所有可用控件,或使用UITextFieldDelegate
[self.view endEditing:YES]
从文档中:
编辑:
使视图(或其中一个嵌入的文本字段)
退出第一响应者状态。
-(BOOL
)编辑:(BOOL
)强制
参数
力
指定YES
强制第一响应者辞职,无论其是否愿意辞职
所以
返回值
YES
如果视图退出第一响应者状态,或者NO
如果视图没有退出第一响应者状态。
讨论
此方法查看当前视图及其子视图
当前为第一响应者的文本字段的层次结构。如果
它找到一个,它要求文本字段辞去第一响应者的职务。如果
力参数设置为YES
,甚至从未询问文本字段;
它被迫辞职
此swift代码用于查找第一响应者:
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
}
Swift 3的更新
此功能隐藏Swift 3中任何活动文本字段的键盘:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
override func touchsbegind(touch:Set,带有事件:UIEvent?){
self.view.endEditing(true)
}
发布了类似问题。
我编写了一个基本的表单创建库来处理这个问题和验证。它叫!
它不使用标记
,而是设置包含字段的数据源,并使用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
}
}
文本视图可能重复以下内容-这不是必需的[self.view endEditing:YES];如果你能在这里分享代码,你会更有用。
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
}
}