将input视图添加到文本框iOS 8时出错
当我在iOS 8上向自己的应用程序添加自定义input视图时遇到问题。这在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
; 键盘是在故事板中创build并通过IBOutlet链接的UIView。
我之前遇到过这个问题。
问题 :
- 您必须确保您将分配给
inputView
或inputAccessoryView
视图不属于任何父视图。 当你从一个ViewController里面的xib创build这些视图时,默认情况下它们被设置为superview的子视图。
解决scheme提示
- 在您将分配给
inputView
或inputAccessoryView
的视图上使用removeFromSuperview
方法
就在becomeFirstResponder
之前,删除用于从becomeFirstResponder
视图input的视图:
mTextField.inputView = mInputVeiw; [mInputVeiw removeFromSuperview]; [mTextField becomeFirstResponder];
希望它有帮助。
我想到了。 我不知道什么是之前的问题,而不是在界面生成器中链接UIView
,而是以编程方式创build一个UIView
,它工作正常。
是的,Tuyen Nguyen解决scheme对我不起作用。 iOS8 / XCode 6中用于设置inputAccessoryView的工作原理并不是从RemoveSuperview中删除但是
[[UIApplication sharedApplication].keyWindow addSubview:**MyViewToBeTheUIAccessoryView**];
我希望这可以帮助别人。
我发现解决scheme以编程方式创buildUIView(就像Milobuild议的那样),但是像@property一样使用时,它崩溃了。 在我的情况下,我需要在viewDidLoad中创buildUIPickerView实例,并分配给UITextView inputView。 当我需要使用pickerView时,我可以这样做
UIPickerView *picker = (UIPickerView *)self.myTextField.inputView;
您必须确保您分配给
inputView
或inputAccessoryView
视图不属于任何父视图。
这个错误尤其令人讨厌,因为在故事板中创build的任何“input视图”(因此添加到VC的view
)不能被设置为inputView
或inputAccessoryView
而不会导致此崩溃。
如果input视图未添加到VC的view
,则input视图将无法在Interface Builder Storyboard中进行可视化编辑。 它只在Storyboard的左侧窗格中可见。
如何将Xcode Storyboard的“Simulated Metrics”工具栏连接到实际的IBOutlet UIToolbar?
我更愿意在Storyboard中直接创buildIB连接到inputAccessoryView
。 这导致这个崩溃。 我find的一个解决scheme是使一个辅助IBOutlet连接到Storyboard中的视图,然后在viewDidLoad
中将其从超级视图中移除,然后立即分配给inputAccessoryView
。 不知道如果我最终会使用这个。
- (void) viewDidLoad { // ... [self.keybordView removeFromSuperview]; self.inputAccessoryView = self.keybordView; }
当我尝试在我的UITextField中设置我的UIDatePicker时,我遇到了同样的问题
- (void)setupViews { ... dobField.inputView = aDatePicker; // Here was the problem ... }
我的解决scheme,我只是“分配”和“初始化”我的datePicker在ViewDidLoad
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ... aDatePicker = [[UIDatePicker alloc] init]; // My solution ... }
在viewDidLoad
中调用removeFromSuperView
似乎不能在模态中正常工作。 我最终设置隐藏的视图,然后从viewDidAppear
superView中删除它。
我的大部分答案都与代码更改有关。 我发现,删除一个出口到UIView里面的主视图固定它。 https://stackoverflow.com/a/40037236/464313
我对这个问题的解决scheme是添加视图到inputView,而不是添加视图控制器父。
当我从storyboard作为inputAccessoryView
返回任何视图时,我有同样的错误。 我用childViewController修复它。 在这里看到我的答案。
我的问题是,我已经命名了一个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>'
解:
检查命名; 如果不需要,不要覆盖。