2017-02-21 78 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

相關問題