0

在我的应用程序中,我UITextField看到了 VC1( UIViewController)。当我更改文本字段中的文本时,我UISearchBar在其视图中调用另一个控制器 VC2 的推送。推送即时消息后,将UISearchBar文本分配给 VC1 的文本字段文本。

在 xib 我的文本字段已经有一些文本“测试字符串”。

当我在 VC1 文本字段中附加任何字符时 - VC2 推送和搜索栏上的文本是正常的。

但是当我在 iPhone 键盘上按下退格键时 - VC2 被按下并且搜索字段上的文本开始逐个删除字符,而整个字符串没有被清空。它发生是因为委托方法递归调用。

如何解决这种行为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

4

3 回答 3

1

我在 iOS 7 上遇到了奇怪的 UISearchBar 动画。通过将 becomeFirstResponder 调用放入 viewDidAppear 并延迟 0.1 解决了这个问题。

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    [self.searchBar performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.1];
}
于 2014-09-09T11:36:19.533 回答
1

我浏览了代码,出于某种原因,删除/退格键被 UIKeyboard 的辅助功能函数反复调用。我还没有找到原因,但一种解决方法是将[self.searchBar becomeFirstResponder];线路放入viewDidAppear而不是viewWillAppear- 这是一个可以接受的解决方法吗?键盘动画略有不同,但我不确定您的需求对此有多敏感。

于 2013-03-27T13:49:37.410 回答
-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;
}
于 2013-03-27T12:41:48.537 回答