从 nib 文件加载的 NSView 已禁用控件并且操作也不起作用

Posted

技术标签:

【中文标题】从 nib 文件加载的 NSView 已禁用控件并且操作也不起作用【英文标题】:NSView loaded from nib file has disabled controls and actions doesn't work too 【发布时间】:2019-07-24 19:05:49 【问题描述】:

我有一个从 nib 文件加载的视图层次结构。最后(最深)层次是这样的:

let xValue =  (point as! DynamicPoint).xValue
let xViewController =  DynamicValuePanelViewController(nibName: "DynamicValuePanelView", value: xValue)
xValueView.addSubview(xViewController.view)

好的,它几乎可以工作。我可以在 NIB NSView 中看到 xValue 对象的值,例如它的 namevalue、一些用于 NSPopUpButton 值的 [String] 数组。 但是,如果我将NSTextField 操作连接到文件的所有者,它就永远不会被解雇。如果我绑定值——getter 有效,setter——永远不会。我添加了NSPopupButton,并绑定了值——是的,它们在菜单中,但它们被禁用,按钮的操作从未触发。什么会导致这种奇怪的单向行为?我可以得到一切,但什么都没有。

【问题讨论】:

xViewController 超出范围时是否释放? 也许不是。怎么办? 你对xViewController保持强烈的引用吗? 是(我认为)var,而不是 weak var.(它是强/弱参考吗?应该是弱参考?) 一个局部变量在超出范围时被释放。创建一个属性以保持强引用。 【参考方案1】:

正如@Willeke 所说——NSViewControllers 必须有强引用。无法“即时”创建它们。

class SomeController:NSViewController 

    var xViewController: DynamicValuePanelViewController!
    @IBOutlet var xValueView: NSView!

    func loadView(for xValue: SomeCustomObject) 
         xViewController =  DynamicValuePanelViewController(nibName: "DynamicValuePanelView", value: xValue)
         xValueView.addSubview(xViewController.view)

    

【讨论】:

以上是关于从 nib 文件加载的 NSView 已禁用控件并且操作也不起作用的主要内容,如果未能解决你的问题,请参考以下文章

从 nib 以编程方式从 NSView 的子类加载对象

Cocoa - 从 nib 加载视图并将其显示在 NSView 容器中,作为子视图

从 viewcontrollernib 加载 NSView

Interface Builder:如何从 nib 文件加载视图

如何将 nib 自定义视图绑定到 NSVIew 子类

从 xib 加载 UITableViewCell 会导致加载 nib 但未设置视图出口