UIViewControllerHierarchyInconsistency 仅在 iOS 8 和 Xcode 6 中使应用程序崩溃
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/25865391/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
UIViewControllerHierarchyInconsistency crashes app only in iOS 8 and Xcode 6
提问by user2511630
i have an app which work fine in iOS 7 and Xcode 5. As soon as I updated it to iOS 8 and Xcode 6 it crashes when app try to slide up UIDatePicker in the view when a textField is tapped. I am using storyboard. Anybody has idea why?
我有一个在 iOS 7 和 Xcode 5 中运行良好的应用程序。一旦我将它更新到 iOS 8 和 Xcode 6,当应用程序尝试在点击 textField 时在视图中向上滑动 UIDatePicker 时,它就会崩溃。我正在使用故事板。有人知道为什么吗?
i have read upon this but its for Xib.
我读过这个,但它是为了 Xib。
App crashes on IOS 6 - UIViewControllerHierarchyInconsistency
应用程序在 IOS 6 上崩溃 - UIViewControllerHierarchyInconsistency
please help thanks
请帮忙谢谢
my code:
我的代码:
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
//set picker color start
[self.myDatePicker setBackgroundColor:[UIColor greenColor]];
//set picker color finish
//calculate bounds start
CGRect textFieldRect = [self.view.window convertRect:textField.bounds fromView:textField];
CGRect viewRect = [self.view.window convertRect:self.view.bounds fromView:self.view];
//calculate bounds finish
//calculate the fraction between the top and bottom of the middle section for the text field's midline start
CGFloat midline = textFieldRect.origin.y + 0.5 * textFieldRect.size.height;
CGFloat numerator = midline - viewRect.origin.y
- MINIMUM_SCROLL_FRACTION * viewRect.size.height;
CGFloat denominator = (MAXIMUM_SCROLL_FRACTION - MINIMUM_SCROLL_FRACTION)
* viewRect.size.height;
CGFloat heightFraction = numerator / denominator;
//calculate the fraction between the top and bottom of the middle section for the text field's midline finish
//Clamp this fraction so that the top section is all "0.0" and the bottom section is all "1.0 start
if (heightFraction < 0.0)
{
heightFraction = 0.0;
}
else if (heightFraction > 1.0)
{
heightFraction = 1.0;
}
//Clamp this fraction so that the top section is all "0.0" and the bottom section is all "1.0 finish
/*start
Now take this fraction and convert it into an amount to scroll by multiplying by the keyboard height for the current screen orientation. Notice the calls to floor so that we only scroll by whole pixel amounts */
UIInterfaceOrientation orientation =
[[UIApplication sharedApplication] statusBarOrientation];
if (orientation == UIInterfaceOrientationPortrait ||
orientation == UIInterfaceOrientationPortraitUpsideDown)
{
animatedDistance = floor(PORTRAIT_KEYBOARD_HEIGHT * heightFraction);
}
else
{
animatedDistance = floor(LANDSCAPE_KEYBOARD_HEIGHT * heightFraction);
}
//finish
//Finally, apply the animation start
CGRect viewFrame = self.view.frame;
viewFrame.origin.y -= animatedDistance;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];
[self.view addSubview:self.myDatePicker];
[self.view setFrame:viewFrame];
[UIView commitAnimations];
}
//Finally, apply the animation finish
//Animate back again start
my crash log
我的崩溃日志
2014-09-14 13:12:52.930 Pay 2014-15 free[2191:83060]
*** Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency',
reason: 'child view controller:<UICompatibilityInputViewController: 0x7be0a570> should have parent view controller:<AddHoursViewController: 0x7c38e800> but requested parent is:<UIInputWindowController: 0x7c238a00>'
*** First throw call stack:
(
0 CoreFoundation 0x02101df6 __exceptionPreprocess + 182
1 libobjc.A.dylib 0x01d8ba97 objc_exception_throw + 44
2 CoreFoundation 0x02101d1d +[NSException raise:format:] + 141
3 UIKit 0x008cff9c -[UIViewController _addChildViewController:performHierarchyCheck:notifyWillMove:] + 210
4 UIKit 0x00f4b44d -[UIInputWindowController changeToInputViewSet:] + 576
5 UIKit 0x00f4c1be __43-[UIInputWindowController setInputViewSet:]_block_invoke + 103
6 UIKit 0x007f73bf +[UIView(Animation) performWithoutAnimation:] + 82
7 UIKit 0x00f4bf9c -[UIInputWindowController setInputViewSet:] + 374
8 UIKit 0x00ce9101 __64-[UIPeripheralHost(UIKitInternal) setInputViews:animationStyle:]_block_invoke1459 + 43
9 UIKit 0x00f473af -[UIInputWindowController performOperations:withAnimationStyle:] + 56
10 UIKit 0x00ce9006 -[UIPeripheralHost(UIKitInternal) setInputViews:animationStyle:] + 1242
11 UIKit 0x00ce91df -[UIPeripheralHost(UIKitInternal) setInputViews:animated:] + 73
12 UIKit 0x00ce922b -[UIPeripheralHost(UIKitInternal) setInputViews:] + 68
13 UIKit 0x00ce1478 -[UIPeripheralHost(UIKitInternal) _reloadInputViewsForResponder:] + 1803
14 UIKit 0x0092be95 -[UIResponder(UIResponderInputViewAdditions) reloadInputViews] + 316
15 UIKit 0x0092b1dc -[UIResponder becomeFirstResponder] + 562
16 UIKit 0x007f1de0 -[UIView(Hierarchy) becomeFirstResponder] + 114
17 UIKit 0x00fb7ffb -[UITextField becomeFirstResponder] + 51
18 UIKit 0x00bbde8f -[UITextInteractionAssistant(UITextInteractionAssistant_Internal) setFirstResponderIfNecessary] + 200
19 UIKit 0x00bc04b6 -[UITextInteractionAssistant(UITextInteractionAssistant_Internal) oneFingerTap:] + 2762
20 UIKit 0x00bb3d27 _UIGestureRecognizerSendActions + 327
21 UIKit 0x00bb25a4 -[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] + 561
22 UIKit 0x00bb45ed -[UIGestureRecognizer _delayedUpdateGesture] + 60
23 UIKit 0x00bb7f6a ___UIGestureRecognizerUpdate_block_invoke661 + 57
24 UIKit 0x00bb7e2d _UIGestureRecognizerRemoveObjectsFromArrayAndApplyBlocks + 317
25 UIKit 0x00babd36 _UIGestureRecognizerUpdate + 3720
26 UIKit 0x007c771b -[UIWindow _sendGesturesForEvent:] + 1356
27 UIKit 0x007c857f -[UIWindow sendEvent:] + 769
28 UIKit 0x0078daa9 -[UIApplication sendEvent:] + 242
29 UIKit 0x0079d8de _UIApplicationHandleEventFromQueueEvent + 20690
30 UIKit 0x00772079 _UIApplicationHandleEventQueue + 2206
31 CoreFoundation 0x020257bf __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
32 CoreFoundation 0x0201b2cd __CFRunLoopDoSources0 + 253
33 CoreFoundation 0x0201a828 __CFRunLoopRun + 952
34 CoreFoundation 0x0201a1ab CFRunLoopRunSpecific + 443
35 CoreFoundation 0x02019fdb CFRunLoopRunInMode + 123
36 GraphicsServices 0x0394624f GSEventRunModal + 192
37 GraphicsServices 0x0394608c GSEventRun + 104
38 UIKit 0x00775e16 UIApplicationMain + 1526
39 Pay 2014-15 free 0x0014ed7d main + 141
40 libdyld.dylib 0x0736cac9 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) `enter code here`
采纳答案by user2511630
-(void)viewDidLoad
{
//init and allocate(my problem was addind nil object into view.
self.myDatePicker = [[UIDatePicker alloc]init];
[self.myDatePicker setDatePickerMode:UIDatePickerModeCountDownTimer];
//to get text off picker
[self.myDatePicker addTarget:self action:@selector(textFieldDidEndEditing:) forControlEvents:UIControlEventValueChanged];
//to hide picker
_tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
}
-(BOOL)textFieldShouldEndEditing:(UITextField *)textField {
NSDateFormatter *dateFormat = [[NSDateFormatter alloc]init];
[dateFormat setDateFormat:@"HH:mm"];
NSDate *date = self.myDatePicker.date;
//or select pickerViewMode
switch (textField.tag) {
case 1: //pulls selected text into textField
self.textField1.text = [dateFormat stringFromDate:date];
break;
}
}
-(void)hideKeyboard {
//NSLog(@"6 hideKeyboard");
[self.textField1 resignFirstResponder];
}
回答by Rahul K Rajan
Either you create date picker programatically or if you are using it as a dragged in component do the below given steps
以编程方式创建日期选择器,或者如果您将其用作拖入组件,请执行以下给定步骤
1.Create Programatically
1.以编程方式创建
datePicker = [[UIDatePicker alloc]init];
[datePicker setDate:[NSDate date]];
//NSString *maxDateString = @"01-Jan-2012";
NSString *theMinimumDate = @"01-Jan-1976";
// the date formatter used to convert string to date
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
// the specific format to use
dateFormatter.dateFormat = @"dd-MMM-yyyy";
// converting string to date
NSDate *theMaximumDate = [NSDate date];//[dateFormatter dateFromString: maxDateString];
NSDate *theminimumDate = [dateFormatter dateFromString: theMinimumDate];
// repeat the same logic for theMinimumDate if needed
// here you can assign the max and min dates to your datePicker
[datePicker setMaximumDate:theMaximumDate];//the max age restriction (if needed, or else dont use this line)
[datePicker setMinimumDate:theminimumDate]; //the min age restriction
// set the mode
[datePicker setDatePickerMode:UIDatePickerModeDate];
// Do any additional setup after loading the view from its nib.
[datePicker addTarget:self action:@selector(updateTextField:) forControlEvents:UIControlEventValueChanged];
// and finally set the datePicker as the input mode of your textfield
[Textfield setInputView:datePicker];
2.From Xib
2.来自西布
[self.DatePickerView removeFromSuperview];
[Textfield setInputView:self.DatePickerView];
[Textfield setInputView:self.DatePickerView];
回答by umairhhhs
date picker should not be child of any super view
日期选择器不应是任何超级视图的子视图
Problem:
问题:
You have to ensure that the view you will assign to inputView or inputAccessoryView don't belong to any parent view. Maybe when you create these views from xib inside a ViewController, by default they are subviews of a superview.
您必须确保分配给 inputView 或 inputAccessoryView 的视图不属于任何父视图。也许当您在 ViewController 中从 xib 创建这些视图时,默认情况下它们是超级视图的子视图。
Solution Tips:
解决方法提示:
Using method removeFromSuperview for the view you will assign to inputView or inputAccessoryView
将方法 removeFromSuperview 用于您将分配给 inputView 或 inputAccessoryView 的视图
see detail in this link
在此链接中查看详细信息
回答by mattlm
The base problem was likely caused by adding the date picker as a child view of the view controllers view.
基本问题可能是由于将日期选择器添加为视图控制器视图的子视图所致。
Removing the following line would have prevented this:
删除以下行可以防止这种情况:
[self.view addSubview:self.myDatePicker];
回答by angraonhunt
The problem is you have to ensure all the inputAccessoryView do not belong to any parent view. Refer: Error when adding input view to textfield iOS 8.
问题是您必须确保所有 inputAccessoryView 不属于任何父视图。请参阅:将输入视图添加到文本字段 iOS 8 时出错。