我有一个键盘附件视图,我将其附加到我的应用程序的键盘上,以便提供可切换的替代输入视图。一切工作正常,但在为应用程序微调性能的过程中,我意识到我正在创建数百个附件视图副本,而实际上只需要一个。所以我实现了一个简单的单例模式。
+ (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,它会完美地重绘自己。每次键盘显示之后它都能完美运行。