0

私のアプリUITextFieldでは、VC1(UIViewController)を表示しています。テキストフィールドのテキストを変更すると、ビュー上で別のコントローラーVC2のプッシュを呼び出しUISearchBarます。imを押した後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

コードを確認しましたが、何らかの理由で、UIKeyboardのアクセシビリティ関数によって削除/バックスペースキーが繰り返し呼び出されています。私はまだ理由を見つけることができませんでしたが、1つの回避策は代わりに[self.searchBar becomeFirstResponder];線を入れることです-それは許容できる回避策ですか?キーボードのアニメーションは少し異なりますが、あなたのニーズがそれにどれほど敏感かはわかりません。viewDidAppearviewWillAppear

于 2013-03-27T13:49:37.410 に答える
1

iOS 7で奇妙なUISearchBarアニメーションが発生しています。becomeFirstResponder呼び出しを0.1の遅延でviewDidAppearに配置することで、問題を解決しました。

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

    [self.searchBar performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.1];
}
于 2014-09-09T11:36:19.533 に答える
-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 に答える