视图设置为inputAccessoryView在添加回普通视图时抛出异常

时间:2015-06-10 20:33:42

标签: ios ios8 uikeyboard inputaccessoryview

我在视图中有文本视图,一些装饰等,我希望该视图停靠在键盘上,就像任何其他消息传递应用程序一样。

当我即将显示我的文字视图时,以下是我将视图附加到键盘的方式:

-(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存储库来演示问题:

https://github.com/can16358p/CPInputAccessoryTest

2 个答案:

答案 0 :(得分:1)

你正在滥用inputView的某些事情。输入视图应该用于查看用户输入数据,输入附件视图可能需要扩展。但它应该像键盘一样。

您的文字视图不属于此类。用户正在将数据输入中。决定是将视图作为输入视图还是在主视图层次结构中,但不要在两者之前移动它。

您真正的问题是,您希望在键盘出现时移动文本视图,以使其可见。为此,请观察键盘通知

UIKeyboardWillShowNotification
UIKeyboardDidShowNotification
UIKeyboardWillHideNotification
UIKeyboardDidHideNotification

并相应地移动您的观点。您可以调整视图控制器的视图边界原点,例如,移动所有内容。

答案 1 :(得分:1)

您可以将文本视图用作整个视图控制器的输入附件视图。请参阅my pull request

除了不断增长的文本视图部分,这几乎是消息应用程序的行为。