2017-02-21 8 views
0

NSStackViewを使用してビューを重ね合わせることができます。拡張できるようにしたいので、正しく理解すればNSCollectionViewを使用できません。NSStackViewにビューを追加すると、アプリケーションがクラッシュする

storyboard

ボタンがスタックを記入します: だから、ストーリーボードでは、私は私がそれを埋めるためにしたいメインビューコントローラでNSStackView(スクロールビューに埋め込まれた)とビューコントローラを作成しました10件の景色を眺め:

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

実行:右の

@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は、単純に次のようになりますこの小さなアプリケーションは正常に動作します。ボタンを押すたびに、さらに10個のスタックビューアイテムが表示されます。しかし、私は右のボタンのいずれかのアプリケーションのクラッシュを押すように大胆さがある場合:私は間違っているつもりです

crash situation

を? 私はIBActionを回避しようとしましたが、何が壊れているかを確認し、ボタンをサブクラス化してmouseUpから呼び出される関数で "buttonDelegate"プロトコルを作成すると、アプリケーションがクラッシュしません。

+0

デバッガ/コンソールにスタックトレースを持っていないのですか? – Larme

+0

いいえ、何も生成されません。その本当に奇妙な、通常は "Current stack trace:"が右側の列に表示されます。しかし、今は青を除いてその空白(lldb) –

答えて

1

ループ内で作成するviewControllerオブジェクトがすぐに解放されるという問題があると思います。

ビューはstackViewに添付されていますが、viewControllerは破棄されています。

各viewControllerへの参照を保持することで、この問題を解決できます。あなたは新しい変数

var itemViewControllers = [StackViewItemViewController]() 

を作成することによって、これを行うと、それにそれぞれ新たに作成されたのViewControllerを追加することができます

itemViewController.append(stackViewItemVC) 
+1

それはそれが見えるトリックをした!感謝万円。アクションのあるボタンからのリファレンスは、ストーリーボードから自動的に設定されていると思っていましたが、遅くなると思います... –

+0

うれしい私はあなたを助けることができました!答えを受け入れるのは気になりますか? – mangerlahn

関連する問題