【问题标题】:Adding views with IBAction to a NSStackView crashes application将带有 IBAction 的视图添加到 NSStackView 会导致应用程序崩溃
【发布时间】:2017-02-21 13:56:40
【问题描述】:

我想使用 NSStackView 将视图堆叠在彼此之上,我还希望它们能够展开,所以如果我理解正确,我就不能使用 NSCollectionView。 因此,在情节提要中,我在主视图控制器中创建了一个 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")
}

运行这个小应用程序运行良好,每次我按下按钮时,都会出现十个堆栈视图项。但是,当我大胆按下右侧的按钮之一时,应用程序崩溃了:

我哪里出错了? 我试图解决 IBAction 以验证这是什么问题,如果我将按钮子类化并使用从 mouseUp 调用的函数创建“buttonDelegate”协议,应用程序不会崩溃。

【问题讨论】:

  • 您在调试器/控制台中没有堆栈跟踪吗?
  • 不,没有生产。它真的很奇怪,通常在右栏中显示“当前堆栈跟踪:”。但现在它是空的,除了蓝色(lldb)

标签: swift xcode cocoa


【解决方案1】:

我猜问题是您在循环中创建的viewController 对象会立即被释放。

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

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

你可以通过创建一个新变量来做到这一点

var itemViewControllers = [StackViewItemViewController]()

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

itemViewController.append(stackViewItemVC)

【讨论】:

  • 看起来成功了!太感谢了。我认为带有动作的按钮的引用是从情节提要中自动设置的,但我想这发生在很晚...
  • 很高兴能为您提供帮助!你介意接受答案吗?
猜你喜欢
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
相关资源
最近更新 更多