成为没有动画的第一响应者
Posted
技术标签:
【中文标题】成为没有动画的第一响应者【英文标题】:Become first responder without animation 【发布时间】:2012-08-11 19:29:52 【问题描述】:有没有办法让UITextField
在没有键盘动画的情况下成为第一响应者?也就是说,让它只出现键盘?
基本上,我将第二个UIViewController
推送到具有UITextField
的UIViewController
上,当第二个视图控制器从堆栈中弹出时,我希望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
。我该怎么办?
我将代码分别放在viewWillAppear
和viewDidAppear
中,它似乎对我有用。 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 版本,或者你在什么时候打电话给becomeFirstResponder
在 viewWillAppear:
中为 iOS5/iOS6 调用 [textFieldReference becomeFirstResponder]
似乎可以按照您希望的方式工作:
它在视图控制器显示它的视图之前被调用(如果你不手动处理视图控制器层次结构),并且一旦它出现在导航控制器中,键盘就已经出现并且文本字段具有焦点。
也就是说,我听说没有公开的方式可以指定键盘外观样式。
【讨论】:
公共方式是 UIView 的核心动画包装器,就像@NSArray 的答案一样。【参考方案4】:当第一次提出问题时,我认为这不是一个选项,但 UIView.performWithoutAnimation
可以正常工作。
UIView.performWithoutAnimation
self.composeView.focusTextField()
【讨论】:
以上是关于成为没有动画的第一响应者的主要内容,如果未能解决你的问题,请参考以下文章
Swift:成为 UITextField 上的第一响应者不起作用?