0

目的: 検索バーのテキストフィールドに右側のビューをラベルとして設定したい

同じことを行うためにios 6で正常に動作する次のコード:

UISearchBar  *search = [[UISearchBar alloc] init];
[search setTintColor:[UIColor grayColor]];
search.frame = CGRectMake(0, 150, 320,50);
search.delegate = self;

UITextField *searchField=[search.subviews objectAtIndex:1];//Changed this line in ios 7
searchField.backgroundColor=[UIColor redColor];

UILabel *label=[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
label.text=@"Hello";
label.textColor=[UIColor greenColor];

searchField.rightView = label;
searchField.rightViewMode = UITextFieldViewModeAlways;

[self addSubView:search];

iOS 7 で同じコードを実行すると (xcode 7.0.2 が完全に更新された状態で)、エラーが発生しました。

上記のコードのコメント行を次のように置き換えます。

UITextField *searchField=[((UIView *)[search.subviews objectAtIndex:0]).subviews lastObject];

これを行った後、エラーは発生しません(テキストフィールドの説明を出力してログを確認し、すべて正常に機能しています)、実行するとテキストフィールドに赤い背景が表示されますが、rightViewのラベルは表示されません私に。さて、このライトビューを表示する方法を誰か助けてくれませんか。

4

3 に答える 3

4

まず第一に、あなたのアプローチは良くなく、iOS バージョン間で保守できません。カスタムビューをrightViewプロパティに設定した後、UISearchBarTextFieldの右側のビューの初期化が行われていると思います。viewDidAppear メソッドで searchField.rightView を設定すると、正しい結果が表示されます。

- (void)viewDidAppear:(BOOL)animated {
     [super viewDidAppear:animated];
     UITextField *searchField=[((UIView *)[_searchBar.subviews objectAtIndex:0]).subviews lastObject];

     UILabel *label=[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
     label.text=@"Hello";
     label.textColor=[UIColor greenColor];

     searchField.rightView = label;
     searchField.rightViewMode = UITextFieldViewModeAlways;
}

iOS 7 シミュレーターでテストしましたが、動作します。

于 2013-10-21T19:41:50.543 に答える