这就是问题所在:当 MessageComposeViewController 被解除时,我的 textView 不会成为第一响应者并且键盘也不会出现。为什么?我把[textView becomeFirstResponder]
代码放在viewWillAppear
. 我能怎么做??
6 回答
我后来通过这一行调用了 becomeFirstResponder:
[self.searchBar performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.1f];
它对我有用。希望这有帮助。
估计是动画的原因。
根据Apple 官方文档中的注释:
在将对象分配为第一响应者之前,请确保您的应用已建立其对象图。例如,您通常在 viewDidAppear: 方法的覆盖中调用 becomeFirstResponder 方法。如果您尝试在 viewWillAppear: 中分配第一响应者,则您的对象图尚未建立,因此 becomeFirstResponder 方法返回 NO。
你应该调用[textView becomeFirstResponder]
inviewDidAppear:
而不是viewWillAppear:
.
似乎您找到的解决方案[self dismissModalViewControllerAnimated:NO]
是使用注释中的相同规则。
您的问题不是特别清楚,但是您假设viewWillAppear
在模态视图控制器(我假设您称为MessageComposeViewController)被解除时调用它。在所有情况下都可能不是这种情况(例如,如果您的视图在 a 内UINavigationController
)
有很多方法可以处理这个问题,但也许最简单的方法是向您的MessageComposeViewController传递对原始视图控制器的引用并调用一个方法来使您UITextField
成为第一响应者。
我或多或少有同样的问题,它与 segue 的动画有关,它看起来像在不使用 resignFirstResponder 的情况下做一个 segue o 关闭一个视图打破与视图的关系,我只是修改 segue 以像这样以编程方式进行:
- (IBAction)back:(id)sender {
[textView resignFirstResponder];
[self performSegueWithIdentifier:@"returnScreen" sender:self];
}
然后在 viewWillAppear 我做了下一个:
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[textView becomeFirstResponder];
....
}
迅速
let when = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC)))
dispatch_after(when, dispatch_get_main_queue()) {
self.searchBar.becomeFirstResponder()
}
我找到了解决办法!!!!!!!!!所以,在messageComposeViewController:didFinishWithResult
我们调用的委托方法中[self dismissModalViewControllerAnimated:YES]
,可是错了!此方法应收到 NO,而不是 YES!然后回忆一下[textView becomeFirstResponder]
方法!我不知道为什么,但是通过这种方式,该应用程序可以完美运行!不过谢谢大家!:)