Mwe*_*ene 16 crash ios uialertcontroller ios8.3
我有一个iPad应用程序.我正在创建一个UIAlertController并添加一个文本字段.它崩溃了.它只在我添加文本字段时崩溃.
let alert = UIAlertController(title: "Enter Name", message:nil, preferredStyle: UIAlertControllerStyle.Alert);
alert.addTextFieldWithConfigurationHandler { (textfield:UITextField!) -> Void in
textfield.placeholder = "Sexy time";
}
alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: {(action:UIAlertAction!) -> Void in
//Some action here
}));
self.presentViewController(alert, animated: true, completion: nil);
Run Code Online (Sandbox Code Playgroud)
我得到一个有趣的崩溃告诉我,约束搞砸了.此代码在<8.3中正常工作,没有任何警告.即使在一个没有任何内容的干净项目中,但是这个代码崩溃了 - 该项目需要成为iPad上的splitview项目.
这是完整的堆栈跟踪加上奇怪的约束警告,只有在尝试将文本字段添加到alertController后才会出现.
2015-04-10 15:25:07.155 Observation[18235:281813] The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0x7fb66cf9dfc0 UITableView:0x7fb66b855000.left == UIView:0x7fb66fae68e0.left>
When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView _viewHierarchyUnpreparedForConstraint:] to debug.
2015-04-10 15:25:07.155 Observation[18235:281813] The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0x7fb66cf9e010 UITableView:0x7fb66b855000.right == UIView:0x7fb66fae68e0.right>
When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView _viewHierarchyUnpreparedForConstraint:] to debug.
2015-04-10 15:25:07.155 Observation[18235:281813] The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0x7fb66fb37f90 UITableView:0x7fb66b855000.top == UIView:0x7fb66fae68e0.top>
When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView _viewHierarchyUnpreparedForConstraint:] to debug.
2015-04-10 15:25:07.156 Observation[18235:281813] The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0x7fb66fb80580 UITableView:0x7fb66b855000.bottom == UIView:0x7fb66fae68e0.bottom>
When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView _viewHierarchyUnpreparedForConstraint:] to debug.
2015-04-10 15:25:13.589 Observation[18235:281813] View hierarchy unprepared for constraint.
Constraint: <NSLayoutConstraint:0x7fb66cf9dfc0 UITableView:0x7fb66b855000.left == UIView:0x7fb66fae68e0.left>
Container hierarchy:
<UIView: 0x7fb66fa86e00; frame = (0 0; 0 0); layer = <CALayer: 0x7fb66fadf8e0>>
| <UIView: 0x7fb66af3e080; frame = (0 0; 0 0); clipsToBounds = YES; layer = <CALayer: 0x7fb66fae32c0>>
| | <_UIAlertControllerShadowedScrollView: 0x7fb66fa68c80; frame = (0 0; 0 0); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x7fb66fa38a80>; layer = <CALayer: 0x7fb66fa97560>; contentOffset: {0, 0}; contentSize: {0, 0}>
| | | <UIView: 0x7fb66fa87350; frame = (0 0; 0 0); layer = <CALayer: 0x7fb66fadf810>>
| | | | <UILabel: 0x7fb66fa88740; frame = (0 0; 0 0); text = 'Enter Name'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7fb66fa94ed0>>
| | | | <UILabel: 0x7fb66fa73710; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7fb66cc0ee10>>
| | | | <UIView: 0x7fb66fae68e0; frame = (0 0; 0 0); clipsToBounds = YES; layer = <CALayer: 0x7fb66fa90160>>
| | <UILabel: 0x7fb66fa3ad40; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7fb66fa73680>>
| | <UICollectionView: 0x7fb66c130200; frame = (0 0; 0 0); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x7fb66faebab0>; layer = <CALayer: 0x7fb66fa3acf0>; contentOffset: {0, 0}; contentSize: {0, 0}> collection view layout: <_UIAlertControllerCollectionViewFlowLayout: 0x7fb66fae0b30>
View not found in container hierarchy: <UITableView: 0x7fb66b855000; frame = (0 20; 768 1004); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x7fb66cf79f30>; layer = <CALayer: 0x7fb66cf600a0>; contentOffset: {0, 0}; contentSize: {768, 25}>
That view's superview: NO SUPERVIEW
2015-04-10 15:25:13.594 Observation[18235:281813] *** Terminating app due to uncaught exception 'NSGenericException', reason: 'Unable to install constraint on view. Does the constraint reference something from outside the subtree of the view? That's illegal. constraint:<NSLayoutConstraint:0x7fb66cf9dfc0 UITableView:0x7fb66b855000.left == UIView:0x7fb66fae68e0.left> view:<UIView: 0x7fb66fa86e00; frame = (0 0; 0 0); layer = <CALayer: 0x7fb66fadf8e0>>'
*** First throw call stack:
(
0 CoreFoundation 0x0000000102940c65 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x000000010221dbb7 objc_exception_throw + 45
2 CoreFoundation 0x0000000102940b9d +[NSException raise:format:] + 205
3 Foundation 0x0000000101daf479 -[NSLayoutConstraint _addToEngine:integralizationAdjustment:mutuallyExclusiveConstraints:] + 187
4 UIKit 0x00000001039bca34 __57-[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:]_block_invoke_2 + 474
5 Foundation 0x0000000101dbd1be -[NSISEngine withBehaviors:performModifications:] + 155
6 UIKit 0x00000001039bc83a __57-[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:]_block_invoke + 452
7 UIKit 0x00000001039bc64d -[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:] + 197
8 UIKit 0x00000001039bc933 __57-[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:]_block_invoke_2 + 217
9 Foundation 0x0000000101dbd1be -[NSISEngine withBehaviors:performModifications:] + 155
10 UIKit 0x00000001039bc83a __57-[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:]_block_invoke + 452
11 UIKit 0x00000001039bc64d -[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:] + 197
12 UIKit 0x00000001039bc933 __57-[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:]_block_invoke_2 + 217
13 Foundation 0x0000000101dbd1be -[NSISEngine withBehaviors:performModifications:] + 155
14 UIKit 0x00000001039bc83a __57-[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:]_block_invoke + 452
15 UIKit 0x00000001039bc64d -[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:] + 197
16 UIKit 0x00000001033b5717 __40-[UIView(Hierarchy) layoutBelowIfNeeded]_block_invoke + 39
17 Foundation 0x0000000101dbd1be -[NSISEngine withBehaviors:performModifications:] + 155
18 UIKit 0x00000001033b5556 -[UIView(Hierarchy) layoutBelowIfNeeded] + 320
19 UIKit 0x000000010374a394 -[_UIAlertControllerAnimatedTransitioning animateTransition:] + 470
20 UIKit 0x000000010344fa4e __56-[UIPresentationController runTransitionForCurrentState]_block_invoke + 1867
21 UIKit 0x000000010336562c _applyBlockToCFArrayCopiedToStack + 314
22 UIKit 0x00000001033654a6 _afterCACommitHandler + 533
23 CoreFoundation 0x0000000102873ca7 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
24 CoreFoundation 0x0000000102873c00 __CFRunLoopDoObservers + 368
25 CoreFoundation 0x0000000102869a33 __CFRunLoopRun + 1123
26 CoreFoundation 0x0000000102869366 CFRunLoopRunSpecific + 470
27 GraphicsServices 0x0000000106dd6a3e GSEventRunModal + 161
28 UIKit 0x0000000103341900 UIApplicationMain + 1282
29 Observation 0x0000000101612927 main + 135
30 libdyld.dylib 0x0000000104f60145 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
Run Code Online (Sandbox Code Playgroud)
Baz*_*207 13
编辑:此修复程序的更改取决于您是使用Xcode 6还是Xcode 7构建,因此我已为两个版本的Xcode添加了相关信息.
我今天碰到了这个,它说的是它无法将文本字段添加到视图控制器的视图中,或者它无法向其超级视图添加自动布局约束.这似乎是因为它还没有创建超级视图来添加它,所以它都是恐慌和崩溃.
我发现的简单修复是在告诉警报控制器出现后添加文本字段.这固定了我,虽然我不确定它是否会影响像警报一样弹出的文本字段.
使用Xcode 6构建
let alertController = UIAlertController(title: "Enter Name", message:nil, preferredStyle: .Alert)
let okAction = UIAlertAction(title: "Ok", style: .Default) { (_) -> Void in
// Some action here
}
alertController.addAction(okAction)
presentViewController(alertController, animated: true, completion: nil)
// Add any text fields after presenting the alert controller to fix crash in iOS 8.3
alertController.addTextFieldWithConfigurationHandler { (textfield) -> Void in
textfield.placeholder = "Name"
}
Run Code Online (Sandbox Code Playgroud)
Ps作为你的代码示例的旁注,请记住使用Swift,你不需要;在每一行的末尾使用,尽管如果你这样做并不重要.
使用Xcode 7构建
当您使用Xcode 7构建应用程序时,Apple似乎已经解决了这个问题.使用上面显示的方法将不再显示iOS 9中的文本字段(即使它仍然在iOS 8中正确显示).
下面是一段代码,它应该是一直有的,当在Xcode 7中构建时,它在iOS 8和iOS 9中正确运行.
let alertController = UIAlertController(title: "Enter Name", message:nil, preferredStyle: .Alert)
alertController.addTextFieldWithConfigurationHandler { (textfield) -> Void in
textfield.placeholder = "Name"
}
let okAction = UIAlertAction(title: "Ok", style: .Default) { (_) -> Void in
// Some action here
}
alertController.addAction(okAction)
presentViewController(alertController, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)
使用Xcode 7 GM(7A218)在Swift 2.0和Obj-C中测试
小智 6
如果在调用-addTextFieldWithConfigurationHandler:([alert isViewLoaded] == YES)时加载了UIAlertController的视图,则会触发此错误.
如果您alert.view在调用-addTextFieldWithConfigurationHandler之前访问,请在调用之后移动您正在执行alert.view的操作-addTextFieldWithConfigurationHandler:.
| 归档时间: |
|
| 查看次数: |
7224 次 |
| 最近记录: |