从 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
对象的值,例如它的 name
、value
、一些用于 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 已禁用控件并且操作也不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Cocoa - 从 nib 加载视图并将其显示在 NSView 容器中,作为子视图