答えはどれも私にとってはまったく役に立ちませんでした。iOS 7 をターゲットにしていますが、答えが見つかりました。
私が試しているのは、Twitter iOS アプリのようなものです。[タイムライン] タブの虫めがねをクリックUISearchBar
すると、[キャンセル] ボタンがアクティブになり、キーボードが表示され、最近の検索画面が表示されます。最近の検索画面をスクロールすると、キーボードが非表示になりますが、[キャンセル] ボタンがアクティブなままになります。
これは私の作業コードです:
UIView *searchBarSubview = self.searchBar.subviews[0];
NSArray *subviewCache = [searchBarSubview valueForKeyPath:@"subviewCache"];
if ([subviewCache[2] respondsToSelector:@selector(setEnabled:)]) {
[subviewCache[2] setValue:@YES forKeyPath:@"enabled"];
}
テーブルビューにブレークポイントを設定することで、この解決策にたどり着きましたscrollViewWillBeginDragging:
。私は自分を調べて、UISearchBar
そのサブビューをむき出しにしました。それは常にタイプUIView
( my variable searchBarSubview
)の1つだけを持っています。

次に、それは呼び出されたものをUIView
保持し、最後の要素である 3 番目の要素がパブリック API ではなくタイプであることに気付きました。そこで、代わりにキー値コーディングを使用することにしました。が に応答するかどうかを確認したところ、幸いにも応答しました。そこで、プロパティを に設定しました。それがキャンセルボタンであることがわかりました。NSArray
subviewCache
UINavigationButton
UINavigationButton
setEnabled:
@YES
UINavigationButton
Apple が a の内部の実装を変更することを決定した場合、これは壊れるにUISearchBar
違いありませんが、一体何でしょう。今のところ動作します。