我想使用NSStackView将视图堆叠在彼此之上,我也希望它们能够扩展,所以如果我理解正确,我就不能使用NSCollectionView。 所以,在storyboard中,我在主视图控制器中创建了一个NSStackView(嵌入在滚动视图中),并且我想用它填充一个视图控制器:
该按钮将使用十个视图填充堆栈视图:
@IBOutlet weak var stackView: NSStackView!
@IBAction func redrawStackView(_ sender: Any) {
for i in 0..<10 {
let stackViewItemVC = storyboard?.instantiateController(withIdentifier: "StackViewItemVC") as! StackViewItemViewController
stackViewItemVC.id = i
stackView.addArrangedSubview(stackViewItemVC.view)
}
}
右边的ViewController看起来像这样:
class StackViewItemViewController: NSViewController {
var id: Int = -1
override func viewDidLoad() {
super.viewDidLoad()
// Do view setup here.
}
@IBAction func buttonPressed(_ sender: Any) {
debugPrint("StackViewItemViewController" + id.description + "pressed")
}
运行这个小应用程序工作正常,每次按下按钮时,会出现十多个堆栈视图项。但是,当我有胆量向右按下其中一个按钮时,应用程序崩溃了:
我哪里错了? 我试图解决这个问题,以确认这会破坏,如果我将按钮子类化并生成一个带有从mouseUp调用函数的“buttonDelegate”协议,则应用程序不会崩溃。
答案 0 :(得分:1)
我想问题是你在循环中创建的stackView
个对象会立即释放。
即使视图附加到viewController
,它的var itemViewControllers = [StackViewItemViewController]()
也会被销毁。
您可以通过保留对每个viewController的引用来解决此问题。
您可以通过创建新变量来实现此目的
itemViewController.append(stackViewItemVC)
然后将每个新创建的viewController添加到它:
{{1}}