2017-02-21 62 views
0

我想使用NSStackView将堆叠视图放在彼此之上,我也希望它们可以展开,因此如果我正确理解它,我不能使用NSCollectionView。 所以,故事板,我创建了一个NSStackView(嵌入在滚动视图)在主视图控制器和视图控制器,我想填补它:使用IBAction添加视图到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) 
    } 
} 

在右边的视图控制器只是看起来是这样的:

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

我要去哪里错了? 我试图绕过IBAction来验证这是什么打破,如果我继承按钮并使用从mouseUp调用的函数创建“buttonDelegate”协议,应用程序不会崩溃。

+0

你难道没有在调试器/控制台堆栈跟踪? – Larme

+0

不,没有生成。它的确很奇怪,通常是“当前堆栈跟踪:”在右栏中列出。但现在它的空,除了蓝色(lldb) –

回答

1

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

即使视图附加到stackView,它的viewController被销毁。

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

您可以通过创建一个新的变量

var itemViewControllers = [StackViewItemViewController]() 

做到这一点,然后添加每个新创建的viewController它:

itemViewController.append(stackViewItemVC) 
+1

这似乎做了诡计!太感谢了。我以为从动作按钮的参考是从故事板自动设置,但我想这发生在晚... –

+0

很高兴我能够帮助你!你介意接受答案吗? – mangerlahn

相关问题