成为没有动画的第一响应者

Posted

技术标签:

【中文标题】成为没有动画的第一响应者【英文标题】:Become first responder without animation 【发布时间】:2012-08-11 19:29:52 【问题描述】:

有没有办法让UITextField 在没有键盘动画的情况下成为第一响应者?也就是说,让它只出现键盘?

基本上,我将第二个UIViewController 推送到具有UITextFieldUIViewController 上,当第二个视图控制器从堆栈中弹出时,我希望UITextField 立即具有第一响应者状态这样当第二个视图控制器被弹出时,用户永远不会注意到文本字段不是第一响应者。

现在我有它,当它弹出时,键盘会在屏幕上显示动画,但我不希望看到它。

有什么想法吗?

【问题讨论】:

【参考方案1】:

你可以像这样使用 UIView 动画

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.0];
[UIView setAnimationDelay:0.0];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];

[textField becomeFirstResponder];  // <---- Only edit this line

[UIView commitAnimations];

这会导致键盘突然出现。

您也可以这样做,但使用-resignFirstResponder

斯威夫特..

    UIView.beginAnimations(nil, context: nil)
    UIView.setAnimationDuration(0.0)
    UIView.setAnimationDelay(0.0)
    someTextView.resignFirstResponder()
    UIView.commitAnimations()

【讨论】:

等等什么是UIView?是self.view,还是UITextField?另外,我应该把它放在viewWillAppear吗? UIView 引用该类。您需要更改的唯一部分是textField。这应该是您要作为 firstResponder 的 UITextField 的名称 嗯,我做到了,但没有任何改变......我认为问题是带有文本字段的视图控制器已经加载。创建视图时,它会立即出现,但是当我从堆栈上的另一个控制器弹回该视图控制器时,它已经加载,所以这永远不会发生。我把这段代码放在viewWillAppear。我该怎么办? 我将代码分别放在viewWillAppearviewDidAppear 中,它似乎对我有用。 viewDidAppear 有点慢,但它仍然有效。我不太确定你遇到了什么问题... 工作就像一个魅力:)【参考方案2】:

只需将其设置为-viewDidAppear 中的第一响应者,以使用户永远不会注意到该字段已丢失其状态。

-(void)viewWillAppear:(BOOL)animated 
    if ([self isViewLoaded] && self.textField)
        [self.textField becomeFirstResponder];
        [super viewWillAppear:animated];

如果您愿意,我已经使用此代码在 dropbox 上放置了一个简短的示例项目。

【讨论】:

您忘记致电[super viewWillAppear:animated] - 可能会给您带来一些问题。也调用self.view 来检查它是否存在于视图控制器会触发视图创建,最好使用[self isViewLoaded]。最后,在这种特殊情况下,您在 viewWillAppear 方法中的事实表明视图已经创建 没关系,忘记我的基本 ios。此外,self.view 检查确实 not 强制创建视图(刚刚测试过),因为当视图控制器的视图为 nil 时调用 -loadView,这是我首先要检查的地点。【参考方案3】:

我不知道你使用的是什么 iOS 版本,或者你在什么时候打电话给becomeFirstResponderviewWillAppear: 中为 iOS5/iOS6 调用 [textFieldReference becomeFirstResponder] 似乎可以按照您希望的方式工作:

它在视图控制器显示它的视图之前被调用(如果你不手动处理视图控制器层次结构),并且一旦它出现在导航控制器中,键盘就已经出现并且文本字段具有焦点。

也就是说,我听说没有公开的方式可以指定键盘外观样式。

【讨论】:

公共方式是 UIView 的核心动画包装器,就像@NSArray 的答案一样。【参考方案4】:

当第一次提出问题时,我认为这不是一个选项,但 UIView.performWithoutAnimation 可以正常工作。

UIView.performWithoutAnimation 
    self.composeView.focusTextField()

【讨论】:

以上是关于成为没有动画的第一响应者的主要内容,如果未能解决你的问题,请参考以下文章

Swift:成为UITextField上的第一响应者?

文本字段上的崩溃成为pickerview的第一响应者

Swift:成为 UITextField 上的第一响应者不起作用?

iOS - UIButton 成为打开键盘的第一响应者

UITextField 不能成为 UITableView 中的第一响应者

iOS:UIAlertController 上的 textField 成为当前警报时的第一响应者