使用IBAction将视图添加到NSStackView会导致应用程序崩溃

时间:2017-02-21 13:56:40

标签: swift xcode cocoa

我想使用NSStackView将视图堆叠在彼此之上,我也希望它们能够扩展,所以如果我理解正确,我就不能使用NSCollectionView。 所以,在storyboard中,我在主视图控制器中创建了一个NSStackView(嵌入在滚动视图中),并且我想用它填充一个视图控制器:

storyboard

该按钮将使用十个视图填充堆栈视图:

@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")
}

运行这个小应用程序工作正常,每次按下按钮时,会出现十多个堆栈视图项。但是,当我有胆量向右按下其中一个按钮时,应用程序崩溃了:

crash situation

我哪里错了? 我试图解决这个问题,以确认这会破坏,如果我将按钮子类化并生成一个带有从mouseUp调用函数的“buttonDelegate”协议,则应用程序不会崩溃。

1 个答案:

答案 0 :(得分:1)

我想问题是你在循环中创建的stackView个对象会立即释放。

即使视图附加到viewController,它的var itemViewControllers = [StackViewItemViewController]() 也会被销毁。

您可以通过保留对每个viewController的引用来解决此问题。

您可以通过创建新变量来实现此目的

itemViewController.append(stackViewItemVC)

然后将每个新创建的viewController添加到它:

{{1}}