2

上にがありUITableViewUISearchBar特定の要件が機能していません。

私はキャンセルボタンを持っていないので、既存の検索をキャンセルするUISearchBar (showsCancelButton = NO)には、x に完全に依存しています。UISearchBarキーボードを閉じるには、キーボードの「検索」ボタンを使用します (ただし、私の場合は [完了] と呼ばれます)。

navigation bar buttonユーザーがアプリで検索すると、ユーザー エクスペリエンスが低下するため、アイテムを無効にします。検索がキャンセルされた場合にのみ、ユーザーはナビゲーション バー ボタンのアイテムを元に戻します。それはすべて働いています。

ただし、回避できない特定のシナリオが1つあります。

1) 検索バーをタップしてテキストを入力します

2) キーボードの [DONE] をクリックすると、キーボードが消えます

3) キーボードを手放すと、x はUISearchBar

4) の x をタップするUISearchBarと、 のテキストがSearchBar消え、表示が更新されます

5) この時点で、ナビゲーション バー ボタンが再び有効になるはずですが、有効になっていません。

コード:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    self.timelineSearchBar.showsCancelButton = NO;
    if ([searchText length] == 0)
    {
        [self.timelineSearchBar performSelector:@selector(resignFirstResponder)
                    withObject:nil
                  afterDelay:0];
    }

上記のコードは、xが押されたときにキーボードを閉じることを意図していることを知っています。これは問題ありません。

私の場合、キーボードは既に破棄されているため、x をタップしてナビゲーション バーの項目を再度有効にします。

    self.addButton.enabled = YES; 

上記の if ステートメントは何も実行せず、ナビゲーション バーの項目は無効のままです。

その if ステートメントで試したこともあります:

[self.timelineSearchBar performSelector:@selector(enableAdd)
                    withObject:nil
                  afterDelay:0];

- (void)enableAdd
{
    self.addButton.enabled = YES;
}

しかし、searchBar がその enableAdd セレクターに応答しないと言ってクラッシュします。

ブレークポイントを作成し、x をタップすると上記の if ステートメントが true と評価され、ステートメントに入ることがわかります。コードを「実行」してボタンを有効にしますが、決して起こりません。

また、私の最後の編集方法は次のとおりです。

- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar
{
    [searchBar setShowsCancelButton:NO animated:YES];
    self.addButton.enabled = YES;
}

更新:私はここでリンクを試しましたhttp://engineeringtheworld.wordpress.com/2011/04/11/detecting-when-clear-is-clicked-in-uisearchbar-x-button/成功しませんでした-textFieldのshouldClearメソッドは呼び出されません。私は iOS 7 を使用しているので、ビューを textFields に埋め込む別の方法があるのではないでしょうか? これは正しいアプローチである可能性が非常に高いですが、サンプルの for ステートメントが true として評価されないため (NSLog に入れました)、私のコードでは機能しません。

更新 2: 上記の if ステートメントから、searchBarCancelButton メソッドを呼び出したところ、極端なループが発生したため、もちろん正しいアプローチではありませんでした:

[self performSelector:@selector(searchBarCancelButtonClicked:) withObject:self.timelineSearchBar afterDelay: 0];

これに関するガイダンスをいただければ幸いです。重要なステップが欠けていることはわかっていますが、それを完全に理解することはできません。

4

3 に答える 3