在我的应用中,我有UITextField
查看VC1(UIViewController
)。当我在文本字段中更改文本时,我会在其视图上调用另一个控制器VC2并使用UISearchBar
。推送后,我将UISearchBar
文本分配给VC1中的文本域文本。
在xib上我的textfield已经有一些文本“Test string”。
当我用任何字符附加VC1文本字段时 - VC2推送和搜索栏上的文字是正常的。
但是当我按下iPhone键盘上的退格键时 - VC2按下并且搜索字段上的文本开始按字符删除char,而整个字符串没有被清空。它发生的原因是委托方法以递归方式调用。
如何修复UISearchBar
的行为?当VC2出现时,我开始在键盘打开的情况下激活搜索栏!这是主要条件。当然,如果我将删除[self.searchBar becomeFirstResponder]
,一切都会正常。
这里有一些代码:
@implementation ViewController1
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString * resultString = [textField.text stringByReplacingCharactersInRange:range withString:string];
ViewController2 * vc2 = [ViewController2 new];
[self.navigationController pushViewController:vc2 animated:YES];
[vc2 loadText: resultString];
return NO;
}
@end
@implementation ViewController2
- (void) viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.searchBar becomeFirstResponder];
}
- (void) loadText: (NSString *) text
{
self.searchBar.text = text;
}
@end
问题的示例源代码:http://yadi.sk/d/NJmTLot73_vrE
答案 0 :(得分:1)
我已经完成了代码,由于某种原因,UIKeyboard的辅助功能会重复调用delete / backspace键。我还没有找到原因,但一个解决方法是将[self.searchBar becomeFirstResponder];
行放入viewDidAppear
而不是viewWillAppear
- 这是一个可接受的解决方法吗?键盘动画略有不同,但我不确定你的需求对此有多敏感。
答案 1 :(得分:1)
我在iOS 7上遇到了奇怪的UISearchBar动画。通过在viewDidAppear中调用我的yesFirstResponder调用延迟为0.1来解决问题。
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.searchBar performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.1];
}
答案 2 :(得分:-1)
您的代码中有递归调用。
self.searchBar.text = text;
致电
textField:shouldChangeCharactersInRange:
反过来调用
loadText:
您可以做的是从searchBar uitextfield中删除委托,设置文本然后返回委托。像这样:
- (void) loadText: (NSString *) text
{
self.searchBar.delegate = nil;
self.searchBar.text = text;
self.searchBar.delegate = vc1;
}