これは元の質問とは正確には関係ないかもしれませんが、UISearchBar の [キャンセル] ボタンをカスタマイズしようとするというより大きな意味で、解決策は引き続き適用できます。これは、そのようなシナリオで立ち往生している他の人を助けると思いました.
私の状況は、キャンセル ボタンのタイトルを変更することでしたが、ひねりを加えて、デフォルトではキャンセル ボタンを表示したくありませんでしたが、ユーザーが検索モードに入ったときに (検索テキスト フィールド内をクリックして) 表示したいだけでした。 )。この時点で、キャンセル ボタンに「完了」というキャプションを付けたいと思いました (「キャンセル」は画面に別の意味を与えていたため、カスタマイズされていました)。
それにもかかわらず、これが私がやったことです(caelavelとArenimのソリューションの組み合わせ):
次の 2 つのメソッドを使用して、UISearchBar を MyUISearchBar としてサブクラス化しました。
-(void) setCloseButtonTitle: (NSString *) title forState: (UIControlState)state
{
[self setTitle: title forState: state forView:self];
}
-(void) setTitle: (NSString *) title forState: (UIControlState)state forView: (UIView *)view
{
UIButton *cancelButton = nil;
for(UIView *subView in view.subviews){
if([subView isKindOfClass:UIButton.class])
{
cancelButton = (UIButton*)subView;
}
else
{
[self setTitle:title forState:state forView:subView];
}
}
if (cancelButton)
[cancelButton setTitle:title forState:state];
}
そして、この検索バーを使用するビューコントローラーでは、次のコードがキャンセル ボタンの表示とそのタイトルのカスタマイズを処理します。
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
MyUISearchBar *sBar = (MyUISearchBar *)searchBar;
[sBar setShowsCancelButton:YES];
[sBar setCloseButtonTitle:@"Done" forState:UIControlStateNormal];
}
奇妙なことに、検索モードを終了すると、キャンセル ボタンはデフォルトで非表示になっているため、キャンセル ボタンを非表示にするために何もする必要はありませんでした。