将输入视图添加到textfield iOS 8时出错

时间:2014-06-04 04:38:20

标签: ios objective-c ios8

当我在iOS 8上为我的应用添加自定义输入视图时,我遇到了问题。这在iOS 7上完全正常,但是当切换到iOS 8时,一切都失败了。

这是堆栈跟踪:

2014-06-03 21:23:54.237 MyApp[1910:47245] *** Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'child view controller:<UICompatibilityInputViewController: 0x1103f9d40>
should have parent view controller:<StopChooser: 0x11083e200> but requested parent is:<UIInputWindowController: 0x110858800>'
*** First throw call stack:
(
    0   CoreFoundation                      0x00000001042eee35 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x0000000103b919a0 objc_exception_throw + 45
    2   CoreFoundation                      0x00000001042eed6d +[NSException raise:format:] + 205
    3   UIKit                               0x00000001023d94cd -[UIViewController _addChildViewController:performHierarchyCheck:notifyWillMove:] + 184
    4   UIKit                               0x0000000102977a2b -[UIInputWindowController changeToInputViewSet:] + 416
    5   UIKit                               0x0000000102973f56 -[UIInputWindowController moveFromPlacement:toPlacement:starting:completion:] + 185
    6   UIKit                               0x000000010297826a -[UIInputWindowController setInputViewSet:] + 526
    7   UIKit                               0x0000000102973c97 -[UIInputWindowController performOperations:withAnimationStyle:] + 50
    8   UIKit                               0x00000001027559bb -[UIPeripheralHost(UIKitInternal) setInputViews:animationStyle:] + 1054
    9   UIKit                               0x0000000102422afd -[UIResponder becomeFirstResponder] + 468
    10  UIKit                               0x00000001023235d3 -[UIView(Hierarchy) becomeFirstResponder] + 99
    11  UIKit                               0x00000001029cdbfb -[UITextField becomeFirstResponder] + 51
    12  UIKit                               0x0000000102655d61 -[UITextInteractionAssistant(UITextInteractionAssistant_Internal) setFirstResponderIfNecessary] + 177
lib: terminating with uncaught exception of type NSException
    (lldb) 

相关部分是前几行。有人可以解释一下吗?我所说的只是myTextview.inputView = keyboard;键盘是在故事板中创建的UIView,并通过IBOutlet链接。

12 个答案:

答案 0 :(得分:110)

之前我遇到过这个问题。

问题

  • 您必须确保分配给inputViewinputAccessoryView的视图不属于任何父视图。当您从ViewController中的xib创建这些视图时,默认情况下它们被设置为superview的子视图。

解决方案提示

  • 在您将分配给removeFromSuperviewinputView
  • 的视图上使用inputAccessoryView方法

答案 1 :(得分:18)

becomeFirstResponder之前删除您从superview使用的视图:

mTextField.inputView = mInputVeiw;
[mInputVeiw removeFromSuperview];
[mTextField becomeFirstResponder];

希望它有所帮助。

答案 2 :(得分:3)

  

您必须确保分配给inputViewinputAccessoryView的视图不属于任何父视图。

这个错误特别令人烦恼,因为任何&#34;输入视图&#34;在故事板中创建(因此添加到VC的view)无法设置为inputViewinputAccessoryView而不会导致此崩溃。

如果输入视图未添加到VC view,则输入视图将无法在Interface Builder故事板中进行可视化编辑。它只能在Storyboard的左侧窗格中显示。

How to connect Xcode Storyboard's "Simulated Metrics" toolbar to an actual IBOutlet UIToolbar?

我更喜欢直接在故事板中与inputAccessoryView进行IB连接。这导致了这次崩溃。我找到的解决方案是将辅助IBOutlet连接到Storyboard中的视图,然后在viewDidLoad中将其从超级视图中删除,然后立即分配给inputAccessoryView。不确定我是否会最终使用它。

- (void)viewDidLoad {

    // ...

    [self.keybordView removeFromSuperview];
    self.inputAccessoryView = self.keybordView;
}

答案 3 :(得分:2)

我明白了。我不确定之前的问题是什么,但我没有在界面构建器中链接UIView,而是以编程方式创建了UIView,并且工作正常。

答案 4 :(得分:2)

我的问题是我已经命名了一个带有textField'inputAccessoryView'的视图......

@property (weak, nonatomic) IBOutlet CustomView *inputAccessoryView;

错误:

Terminating app due to uncaught exception
'UIViewControllerHierarchyInconsistency', reason: 'child view
controller:<UICompatibilityInputViewController: 0x7fed7063a1a0> should
have parent view controller:<MyViewController: 0x7fed70606f00> but
requested parent is:<UIInputWindowController: 0x7fed710cde00>'

解决方案:

  

检查命名;如果不需要,请不要覆盖。

答案 5 :(得分:1)

我找到了以编程方式创建UIView的解决方案(如Milo所建议的那样),但是当它像@property一样使用时会崩溃。在我的例子中,我需要在viewDidLoad中创建UIPickerView实例并协助UITextView inputView。当我需要访问pickerView时,我会像这样得到它

UIPickerView *picker = (UIPickerView *)self.myTextField.inputView;

答案 6 :(得分:1)

是的,Tuyen Nguyen解决方案对我不起作用。 在iOS 8 / Xcode 6中设置inputAccessoryView对我有用的不是removeFromSuperview而是:{/ p>

[[UIApplication sharedApplication].keyWindow addSubview:**MyViewToBeTheUIAccessoryView**];

我希望这有助于某人。

答案 7 :(得分:1)

当我尝试在UITextField中设置我的UIDatePicker时遇到了同样的问题

- (void)setupViews {
    ...
    dobField.inputView = aDatePicker; // Here was the problem
    ...
}

我的解决方案,我只是在ViewDidLoad中“分配”和“初始化”我的datePicker

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    ...
    aDatePicker = [[UIDatePicker alloc] init]; // My solution
    ...
}

答案 8 :(得分:0)

removeFromSuperView中拨打viewDidLoad似乎无法在模态中正常运行。我最终设置隐藏的视图,然后从viewDidAppear中的superView中删除它。

答案 9 :(得分:0)

我的大多数答案都与代码更改有关。我发现在主视图中删除UIView的插座修复了它。 https://stackoverflow.com/a/40037236/464313

答案 10 :(得分:0)

我对此问题的解决方案是向inputView添加视图,但不将视图控制器添加到父级。

答案 11 :(得分:0)

当我从故事板返回inputAccessoryView的任何视图时,我遇到了同样的错误。我用childViewController修复它。请参阅我的回答here