当控制器更改的第一个响应程序工作时,将文本设置为UISearchBar很奇怪

时间:2013-03-27 12:34:57

标签: ios uitextfield uisearchbar settext becomefirstresponder

在我的应用中,我有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

3 个答案:

答案 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;
}