切り替え可能な代替入力ビューを提供するために、アプリのキーボードに接続するキーボード アクセサリ ビューがあります。すべてが正常に機能していますが、アプリのパフォーマンスを微調整しているときに、本当に必要なのはアクセサリ ビューのコピーを何百も作成していることに気付きました。そこで、単純なシングルトン パターンを実装しました。
+ (v2KeyboardAccessory*) sharedInstance
{
static dispatch_once_t pred;
static v2KeyboardAccessory* theObject = nil;
dispatch_once(&pred, ^{ theObject = [[self alloc] init]; });
return theObject;
}
subviewcontroller の作成中 (複雑です)、textview のアクセサリ ビューを設定し、(便宜上) 参照を保持します。
v2KeyboardAccessory *newAccessory = [v2KeyboardAccessory sharedInstance];
self.inputAccessory = newAccessory;
self.textView.inputAccessoryView = newAccessory.view;
subviewcontroller の textViewShouldBeginEditing メソッドで、subviewcontroller を現在のデリゲートとして設定しました (入力ビューの切り替えや元に戻すプロセスの処理などのいくつかの主要なメソッド用)。
-(BOOL)textViewShouldBeginEditing:(UITextView *)textView
{
self.inputAccessory.delegate = self;
self.inputAccessory.undoManager = self.textView.undoManager;
// Some code to set which input view to display initially, etc
return YES;
}
他に考えられる唯一の変更点は、キーボード アクセサリ ビュー コントローラーの viewDidLoad メソッドから viewWillAppear メソッドにコードを移動したことです。基本的に、ビューの高さを 44 に固定するだけです。
問題は、アクセサリ ビューを備えたキーボードが最初に (そして最初だけ) 表示されることです。キーボード自体は問題ありませんが、アクセサリ ビューは画面に表示されず、キーボードの背景 (iOS7 では灰色の半透明) がキーボード自体の上の画面。何らかの理由でアクセサリが画面の上部のすぐ上に描画され、キーボードが残りのスペースを埋めていると思われますが、デバッグではそれを確認できません。
シングルトンパターンを実装する前は、アクセサリは完全に機能していました。キーボードを上げたまま iPad を回転させると、完全に再描画されます。その後、キーボードが表示されるたびに、完全に機能します。