约束导致的崩溃

时间:2019-03-13 06:21:53

标签: ios swift constraints nslayoutconstraint

我通过UIViewController中的代码添加了约束。我还尽可能将translatesAutoresizingMaskIntoConstraints设置为false。尽管如此,由于内部一致性,该应用仍然崩溃并显示异常。

这是设计和添加约束的代码,这会导致异常:

head = UIView.init()
head?.backgroundColor = UIColor.cyan
self.view.addSubview(head!)

self.view.translatesAutoresizingMaskIntoConstraints = false
head?.translatesAutoresizingMaskIntoConstraints = false

head?.leadingAnchor.constraint(equalTo: self.view.layoutMarginsGuide.leadingAnchor).isActive = true
head?.topAnchor.constraint(equalTo: self.view.layoutMarginsGuide.topAnchor).isActive = true
head?.trailingAnchor.constraint(equalTo: self.view.layoutMarginsGuide.trailingAnchor).isActive = true
head?.heightAnchor.constraint(equalToConstant: 44).isActive = true

我没有使用任何情节提要,因此在Xcode中,在项目的常规设置中,主界面变为空白。使用调用堆栈的完整崩溃日志--->

 2019-03-13 11:44:09.032181+0530 codeUIDesign[2645:107166] *** Assertion failure in -[UIView _nsis_center:bounds:inEngine:forLayoutGuide:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKitCore_Sim/UIKit-3698.93.8/NSLayoutConstraint_UIKitAdditions.m:3588
2019-03-13 11:44:09.037194+0530 codeUIDesign[2645:107166] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Error in compatibility flow'
*** First throw call stack:
(
    0   CoreFoundation                      0x00000001119e41bb __exceptionPreprocess + 331
    1   libobjc.A.dylib                     0x0000000110027735 objc_exception_throw + 48
    2   CoreFoundation                      0x00000001119e3f42 +[NSException raise:format:arguments:] + 98
    3   Foundation                          0x000000010fa2a877 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 194
    4   UIKitCore                           0x000000011478a35b -[UIView(AdditionalLayoutSupport) _nsis_center:bounds:inEngine:forLayoutGuide:] + 2454
    5   UIKitCore                           0x0000000114798ee9 -[UILayoutGuide _updateLayoutFrameInOwningView:fromEngine:] + 74
    6   UIKitCore                           0x0000000114788c5a -[UIView(AdditionalLayoutSupport) _is_layout] + 376
    7   UIKitCore                           0x0000000114843c66 -[UIView(Hierarchy) _updateConstraintsAsNecessaryAndApplyLayoutFromEngine] + 1002
    8   UIKitCore                           0x0000000114858795 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1441
    9   QuartzCore                          0x0000000115de0b19 -[CALayer layoutSublayers] + 175
    10  QuartzCore                          0x0000000115de59d3 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 395
    11  QuartzCore                          0x0000000115de0a40 -[CALayer layoutIfNeeded] + 187
    12  UIKitCore                           0x0000000113d70ed4 -[UIViewController window:willAnimateRotationToInterfaceOrientation:duration:] + 658
    13  UIKitCore                           0x00000001143b465f -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:isRotating:] + 5605
    14  UIKitCore                           0x00000001143b21c7 -[UIWindow _setRotatableViewOrientation:updateStatusBar:duration:force:] + 123
    15  UIKitCore                           0x00000001143a7514 -[UIWindow _setHidden:forced:] + 716
    16  UIKitCore                           0x00000001143ba5c0 -[UIWindow makeKeyAndVisible] + 42
    17  codeUIDesign                        0x000000010f7000c8 $S12codeUIDesign11AppDelegateC11application_29didFinishLaunchingWithOptionsSbSo13UIApplicationC_SDySo0k6LaunchJ3KeyaypGSgtF + 1128
    18  codeUIDesign                        0x000000010f7002c4 $S12codeUIDesign11AppDelegateC11application_29didFinishLaunchingWithOptionsSbSo13UIApplicationC_SDySo0k6LaunchJ3KeyaypGSgtFTo + 228
    19  UIKitCore                           0x0000000114365bde -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 280
    20  UIKitCore                           0x00000001143675cb -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 3979
    21  UIKitCore                           0x000000011436cc2f -[UIApplication _runWithMainScene:transitionContext:completion:] + 1623
    22  UIKitCore                           0x0000000113b8b4e9 __111-[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:]_block_invoke + 866
    23  UIKitCore                           0x0000000113b9429c +[_UICanvas _enqueuePostSettingUpdateTransactionBlock:] + 153
    24  UIKitCore                           0x0000000113b8b126 -[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:] + 233
    25  UIKitCore                           0x0000000113b8bae0 -[__UICanvasLifecycleMonitor_Compatability activateEventsOnly:withContext:completion:] + 1085
    26  UIKitCore                           0x0000000113b89cb5 __82-[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:]_block_invoke + 795
    27  UIKitCore                           0x0000000113b8995f -[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:] + 435
    28  UIKitCore                           0x0000000113b8ea90 __125-[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:]_block_invoke + 584
    29  UIKitCore                           0x0000000113b8f80e _performActionsWithDelayForTransitionContext + 100
    30  UIKitCore                           0x0000000113b8e7ef -[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:] + 221
    31  UIKitCore                           0x0000000113b9393a -[_UICanvas scene:didUpdateWithDiff:transitionContext:completion:] + 392
    32  UIKitCore                           0x000000011436b44e -[UIApplication workspace:didCreateScene:withTransitionContext:completion:] + 515
    33  UIKitCore                           0x0000000113f0fd09 -[UIApplicationSceneClientAgent scene:didInitializeWithEvent:completion:] + 357
    34  FrontBoardServices                  0x000000011cb602da -[FBSSceneImpl _didCreateWithTransitionContext:completion:] + 448
    35  FrontBoardServices                  0x000000011cb6b443 __56-[FBSWorkspace client:handleCreateScene:withCompletion:]_block_invoke_2 + 271
    36  FrontBoardServices                  0x000000011cb6ab3a __40-[FBSWorkspace _performDelegateCallOut:]_block_invoke + 53
    37  libdispatch.dylib                   0x0000000112e07602 _dispatch_client_callout + 8
    38  libdispatch.dylib                   0x0000000112e0ab78 _dispatch_block_invoke_direct + 301
    39  FrontBoardServices                  0x000000011cb9fba8 __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 30
    40  FrontBoardServices                  0x000000011cb9f860 -[FBSSerialQueue _performNext] + 457
    41  FrontBoardServices                  0x000000011cb9fe40 -[FBSSerialQueue _performNextFromRunLoopSource] + 45
    42  CoreFoundation                      0x0000000111949721 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    43  CoreFoundation                      0x0000000111948f93 __CFRunLoopDoSources0 + 243
    44  CoreFoundation                      0x000000011194363f __CFRunLoopRun + 1263
    45  CoreFoundation                      0x0000000111942e11 CFRunLoopRunSpecific + 625
    46  GraphicsServices                    0x00000001185541dd GSEventRunModal + 62
    47  UIKitCore                           0x000000011436e81d UIApplicationMain + 140
    48  codeUIDesign                        0x000000010f7009c7 main + 71
    49  libdyld.dylib                       0x0000000112e7d575 start + 1
    50  ???                                 0x0000000000000001 0x0 + 1
)

我尝试使用与我在XCode版本10.0(10A255)中发布有问题的相同代码,但工作正常,但在XCode版本10.1(10B61)中显示崩溃。

3 个答案:

答案 0 :(得分:3)

您需要在head视图中添加它:

head.translatesAutoresizingMaskIntoConstraints = false

然后删除这一行:

self.view.translatesAutoresizingMaskIntoConstraints = false

所以您的代码如下:

let head = UIView()
head.backgroundColor = UIColor.cyan
self.view.addSubview(head)

// This new line added
head.translatesAutoresizingMaskIntoConstraints = false

head.leadingAnchor.constraint(equalTo: self.view.layoutMarginsGuide.leadingAnchor).isActive = true
head.topAnchor.constraint(equalTo: self.view.layoutMarginsGuide.topAnchor).isActive = true
head.trailingAnchor.constraint(equalTo: self.view.layoutMarginsGuide.trailingAnchor).isActive = true
head.heightAnchor.constraint(equalToConstant: 44).isActive = true

答案 1 :(得分:0)

您忘记给框架打个招呼。试试这个:

class ViewController: UIViewController {

    private var head: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        setup()
    }

    private func setup() {
        head = UIView(frame: .zero)
        head.translatesAutoresizingMaskIntoConstraints = false
        head.backgroundColor = .red

        self.view.addSubview(head)

        head.leftAnchor.constraint(equalTo: self.view.leftAnchor, constant: 16).isActive = true
        head.rightAnchor.constraint(equalTo: self.view.rightAnchor, constant: -16).isActive = true
        head.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 16).isActive = true
        head.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -16).isActive = true
    }
}

答案 2 :(得分:-1)

我已经尝试过此代码,并且在我这一方面工作得很好。请检查:

var head: UIView? = nil

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    head = UIView.init()
    head?.backgroundColor = UIColor.cyan
    self.view.addSubview(head!)

    head?.translatesAutoresizingMaskIntoConstraints = false

    head?.leadingAnchor.constraint(equalTo: self.view.layoutMarginsGuide.leadingAnchor).isActive = true
    head?.topAnchor.constraint(equalTo: self.view.layoutMarginsGuide.topAnchor).isActive = true
    head?.trailingAnchor.constraint(equalTo: self.view.layoutMarginsGuide.trailingAnchor).isActive = true
    head?.heightAnchor.constraint(equalToConstant: 44).isActive = true
}

不要写此行,您不需要:

self.view.translatesAutoresizingMaskIntoConstraints = false