我在视图中有文本视图,一些装饰等,我希望该视图停靠在键盘上,就像任何其他消息传递应用程序一样。
当我即将显示我的文字视图时,以下是我将视图附加到键盘的方式:
-(BOOL)textViewShouldBeginEditing:(UITextView *)textView{
UIView *inputView = self.textInputView; //connected at IB outlet from storyboard, also contains the text view itself.
constraintsOfTextInputView = [self constraintsRelatedToView:inputView]; //to be able to add them again
[[UIApplication sharedApplication].keyWindow addSubview:self.textInputView];
textView.inputAccessoryView = inputView;
editingTextView = textView;
return YES;
}
当解雇时:
//using notification hook for UIKeyboardWillHideNotification because
//textView[Will|Did]EndEditing is called too late
-(void)keyboardWillHide{
if(editingTextView && constraintsOfTextInputView){
editingTextView.inputAccessoryView = nil;
[self.textInputView removeFromSuperview];
[self.view addSubview:self.textInputView]; <--- EXCEPTION
[self.view addConstraints:constraintsOfTextInputView];
[self.view layoutIfNeeded];
editingTextView = nil;
constraintsOfTextInputView = nil;
}
}
尽管我做的与我在添加时所做的完全相反,但我得到了这个例外:
*** Terminating app due to uncaught exception
'UIViewControllerHierarchyInconsistency', reason: 'child view controller:
<UICompatibilityInputViewController: 0x13307ba20> should have parent view
controller:<ULPostViewController: 0x1307a7c00> but actual parent is:
<UIInputWindowController: 0x12f0be200>'
如何摆脱这个问题?我在iOS 8上(并且不支持旧版本)。
更新:我已经创建了一个git存储库来演示问题:
答案 0 :(得分:1)
你正在滥用inputView
的某些事情。输入视图应该用于查看用户输入数据,输入附件视图可能需要扩展。但它应该像键盘一样。
您的文字视图不属于此类。用户正在将数据输入到中。决定是将视图作为输入视图还是在主视图层次结构中,但不要在两者之前移动它。
您真正的问题是,您希望在键盘出现时移动文本视图,以使其可见。为此,请观察键盘通知
UIKeyboardWillShowNotification
UIKeyboardDidShowNotification
UIKeyboardWillHideNotification
UIKeyboardDidHideNotification
并相应地移动您的观点。您可以调整视图控制器的视图边界原点,例如,移动所有内容。
答案 1 :(得分:1)
您可以将文本视图用作整个视图控制器的输入附件视图。请参阅my pull request。
除了不断增长的文本视图部分,这几乎是消息应用程序的行为。