becomeFirstResponder 在 iOS 8 中不起作用
Posted
技术标签:
【中文标题】becomeFirstResponder 在 iOS 8 中不起作用【英文标题】:becomeFirstResponder not working in iOS 8 【发布时间】:2014-11-24 04:55:07 【问题描述】:我正在使用 UITextField 的方法 becomeFirstResponder 来显示键盘。 这在 ios 7 中有效。但在 iOS 8 中,此方法不显示键盘。
UITextField *txtAddNew = [[UITextField alloc] initWithFrame:CGRectMake(10,10,240, 21)];
txtAddNew.font = [UIFont fontWithName:@"Helvetica" size:16];
txtAddNew.clearButtonMode = UITextFieldViewModeWhileEditing;
txtAddNew.returnKeyType = UIReturnKeyDone;
txtAddNew.delegate = self;
txtAddNew.autocorrectionType = UITextAutocorrectionTypeNo;
txtAddNew.tag = 15;
// Open keyboard
[txtAddNew becomeFirstResponder];
在 iOS 8 中有什么方法可以做到吗?
【问题讨论】:
我没有看到您将该文本字段作为子视图添加到任何视图中。 【参考方案1】:尝试如下调用 becomeFirstResponder
[txtAddNew performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0];
根据苹果,
只有当当前响应者对象成为第一个响应者时 响应者可以放弃第一响应者状态(canResignFirstResponder) 并且新的响应者可以成为第一响应者。
您可以调用此方法来使响应者对象(例如视图) 急救人员。但是,您应该只在该视图上调用它,如果它 是视图层次结构的一部分。如果视图的 window 属性持有 UIWindow 对象,它已安装在视图层次结构中;如果它 返回 nil,视图与任何层次结构分离。
【讨论】:
当 [txtAddNew becomeFirstResponder] 在某些情况下不起作用时,这很奇怪。有什么区别? @mskw 可能是因为调用选择器强制resignFirstResponder
。【参考方案2】:
斯威夫特 3
这是已接受答案的 swift 3 版本。为了让它工作,我还必须添加一个延迟。
txtAddNew.perform(
#selector(becomeFirstResponder),
with: nil,
afterDelay: 0.1
)
【讨论】:
【参考方案3】:我想你错过了addsubview
txtAddNew
到 Mainview
txtAddNew.tag = 15;
[self.view addsubview:txtAddNew];
// Open keyboard
[txtAddNew becomeFirstResponder];
【讨论】:
【参考方案4】:在您的代码中添加这一行。我希望它会工作
[txtAddNew performSelectorOnMainThread:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0];
【讨论】:
【参考方案5】:Swift 4 和 iOS 11
就我而言,无论我尝试了什么,我都无法设置第一响应者,直到我尝试了这个。
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
if cell.isKind(of: YOURTABLEVIEWCELL.self)
if let yourCell = cell as? YOURTABLEVIEWCELL
yourCell.yourUiTextField.becomeFirstResponder()
希望这可以帮助遇到同样问题的人。
【讨论】:
【参考方案6】:有时先让第一响应者辞职会有所帮助:
var tapGesture = UITapGestureRecognizer()
tapGesture.rac_gestureSignal().subscribeNext [weak self] (_) -> Void in
self?.inputTextField.resignFirstResponder()
self?.inputTextField.becomeFirstResponder()
self.charViewsContainer.addGestureRecognizer(tapGesture)
【讨论】:
这对我有用,是否有任何 Apple 文档可以帮助您做到这一点?【参考方案7】:对于 iOS 9.3,以下对我有用:
private var searchTextFieldShouldReturn = false
override func viewWillAppear(animated: Bool)
super.viewWillAppear(animated)
self.searchTextFieldShouldReturn = false
self.searchTextField.becomeFirstResponder()
override func viewWillDisappear(animated: Bool)
super.viewWillDisappear(animated)
self.searchTextFieldShouldReturn = true
self.searchTextField.resignFirstResponder()
func textFieldShouldReturn(textField: UITextField) -> Bool
self.searchTextFieldShouldReturn = true
textField.resignFirstResponder()
return true
func textFieldShouldEndEditing(textField: UITextField) -> Bool
return self.searchTextFieldShouldReturn
所以您需要确保您还实现了 textFieldShouldEndEditing 委托。
【讨论】:
【参考方案8】:以防万一其他人和我有同样的问题:
我有一个IBOutlet
连接到我的UITextField
。我错误地在我的viewDidLoad
方法中初始化了它。即[[textField alloc] init];
。我删除了这个,一切都恢复了。
【讨论】:
以上是关于becomeFirstResponder 在 iOS 8 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 6 中,-[UITextField becomeFirstResponder] 在 -viewWillAppear 中不起作用:
IOS 获取文本焦点 主动召唤出键盘(becomeFirstResponder)
UITextView becomeFirstResponder 使用 iOS SDK 8.2 失败
becomeFirstResponder 第二次不显示键盘(ios 6 + 故事板)
ios8 UIAlertView becomeFirstResponder for Password UITextField 不起作用
Xcode 9.3.1 - iOS Swift 4.1 UITextView.becomeFirstResponder 线程 1:EXC_BAD_ACCESS(代码=1,地址=0x4d555458)