簡體   English   中英

Swift Playground 錯誤:執行被中斷,原因:信號 SIGABRT

[英]Swift Playground error: Execution was interrupted, reason: signal SIGABRT

如何甚至調試這個錯誤? 似乎沒有額外的錯誤描述。

失敗的代碼:

import UIKit
import PlaygroundSupport

let containerView = UIView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
containerView.backgroundColor = UIColor.white

let stackView = UIStackView()
stackView.translatesAutoresizingMaskIntoConstraints = false
containerView.addSubview(stackView)
stackView.addConstraint(.init(item: stackView, attribute: .top, relatedBy: .equal, toItem: containerView, attribute: .top, multiplier: 1, constant: 0))
stackView.addConstraint(.init(item: stackView, attribute: .leading, relatedBy: .equal, toItem: containerView, attribute: .leading, multiplier: 1, constant: 0))

PlaygroundPage.current.liveView = containerView // error: Execution was interrupted, reason: signal SIGABRT.

完整錯誤:

錯誤:執行被中斷,原因:信號 SIGABRT。 進程一直停留在被中斷的地方,使用“線程返回-x”返回到表達式求值前的狀態。

完整的控制台日志:

libc++abi.dylib:以未捕獲的 NSException 類型異常終止

問題是您將約束添加到stackView而不是containerView

addConstraint狀態的文檔

要添加到視圖的約束。 約束只能引用視圖本身或其子視圖。

containerViewstackView的超級視圖,而不是子視圖。

如果您更改代碼以將約束添加到containerView ,它將運行

containerView.addConstraint(.init(item: stackView, attribute: .top, relatedBy: .equal, toItem: containerView, attribute: .top, multiplier: 1, constant: 0))
containerView.addConstraint(.init(item: stackView, attribute: .leading, relatedBy: .equal, toItem: containerView, attribute: .leading, multiplier: 1, constant: 0))

您可能希望添加尾隨和底部約束,以便堆棧視圖填充整個容器視圖。 當然,您還需要添加一個arrangedSubview的子視圖,以便堆棧視圖中實際上有一些內容。

通過引用布局指南而不是這種舊的、更冗長的方法來添加約束通常更簡單:

import UIKit
import PlaygroundSupport

let containerView = UIView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
containerView.backgroundColor = UIColor.white

let stackView = UIStackView()
stackView.translatesAutoresizingMaskIntoConstraints = false
containerView.addSubview(stackView)

stackView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor).isActive = true
stackView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor).isActive = true
stackView.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true
stackView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor).isActive = true


let label = UILabel()
label.text = "Hello world"
label.textColor = .black
stackView.addArrangedSubview(label)
PlaygroundPage.current.liveView = containerView

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM