20

iOS 6 および iOS 7 で動作するはずのアプリで、iOS 7 で実行すると、ナビゲーション バーに埋め込まれた検索バーのキャンセル ボタンが表示されなくなりました。iOS 6 では機能します。

検索バーはナビゲーション バーのタイトル ビューにあり、検索バーがファーストレスポンダーになるとキャンセル ボタンが表示されます。

iOS7

ここに画像の説明を入力

iOS6

ここに画像の説明を入力

孤立したテスト ケースでは、コードは非常に単純です。

@interface MyViewController : UITableViewController<UISearchBarDelegate>

@property (nonatomic) IBOutlet UISearchBar* searchBar;

@end


@implementation MyViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.navigationItem.titleView = self.searchBar;
}

- (void) searchBarTextDidBeginEditing: (UISearchBar*) searchBar {
    [searchBar setShowsCancelButton: YES animated: YES];
}

@end

これは、ドキュメントで見逃していた iOS 7 の意図的な変更ですか? はいの場合、代わりになるものは何ですか?

そうでない場合、コードに誤りがありますか?

4

8 に答える 8

12

rightBarButtonItem を追加するだけで、この問題を簡単に解決しました:)

self.navigationItem.titleView = self.searchBar;
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Cancel", nil) style:UIBarButtonItemStylePlain target:self action:@selector(didClickCancelButton:)] autorelease];

ただし、現在の iOS バージョンが >= 7.0 であるかどうかを確認する必要があります。それ以外の場合は、2 つの「キャンセル」ボタンが表示されます。

ところで、この方法では、常に有効になっている「キャンセル」ボタンを使用できます

于 2013-10-28T03:01:33.730 に答える
1

私の意見では、これはバグです。これが私の回避策です。完璧ではありませんが、iOS 6 と 7 の両方で動作します。iOS7 では、フェードアウト中に検索バーのテキスト フィールドがキャンセル ボタンの上をスライドし、iOS6 ではテキスト フィールドの幅の拡大がアニメーション化されません。

@interface FTViewController ()
@property(nonatomic, strong) UISearchBar *searchBar;
@end

@implementation FTViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.searchBar = [[UISearchBar alloc] init];
    self.searchBar.delegate = self;

    if (NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_6_1) {
        // iOS 6.1 and older (only tested on 6.1)
        [self.searchBar sizeToFit];
        self.searchBar.backgroundImage = nil;
    }

    self.navigationItem.titleView = self.searchBar;
}

-(void)cancelBarButtonItemClicked:(id)sender
{
    [self searchBarCancelButtonClicked:self.searchBar];
}

-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
{
    [searchBar resignFirstResponder];
    [self.navigationItem setRightBarButtonItem:nil animated:YES];
}

-(BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
{
    UIBarButtonItem *cancelBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelBarButtonItemClicked:)];
    [self.navigationItem setRightBarButtonItem:cancelBtn animated:YES];

    return YES;
}
@end
于 2013-11-15T09:57:55.677 に答える