在类中创建自定义操作以在Interface Builder中使用

时间:2018-12-21 15:46:18

标签: swift macos interface-builder ibinspectable

我想在一个类中创建一个自定义操作连接,该连接在Interface Builder中应该可见。例如-我将动作/目标属性添加到NSView类中,如下所示:

weak open var object: AnyObject?    
open var something: Selector?

操作为something,目标为object。 现在,我希望在Interface Builder中为something提供“发送动作”链接/连接,并能够将某个类的@IBAction方法建立连接(例如视图的控制器),就像可以通过简单的NSButton完成一样。也许这不可能,或者我必须在自定义操作/目标对之前添加一些关键字,就像我们需要使属性@IBInspectable出现在Attributes Inspector中一样。

欢迎任何帮助;-)

2 个答案:

答案 0 :(得分:0)

我认为您无法做到。您可以将@IBInspectable属性添加到自定义NSView子类中,但是属性没有选择器或操作数据类型。唯一允许的类型是布尔值,数字,字符串,本地化字符串,点,大小,矩形,范围,颜色,图像,无。

Interface Builder具有对处理控件的目标动作属性的硬连线支持。

(顺便说一句,您可能应该将Mac OS标签添加到您的问题中。此板上的大多数Apple流量与iOS相关。

编辑:

正如某人在评论中所说,如果您要创建一个具有目标/动作的对象,则该对象可能应该是NSControl,而不是NSView。控件是处理目标动作的对象系列,Interface Builder中有一种机制可以向控件添加目标/动作。

答案 1 :(得分:0)

在 iOS 中,有一个有点俗气的选择——你可以有一个 UIBarButtonItem 的出口,然后有人可以在他们的 xib 或故事板中放置一个独立的 UIBarButtonItem。 UIBarButtonItem 然后可以拥有目标/动作,然后您的类可以从这里在awakeFromNib 中拉出目标/动作并将值分配给您自己的类。这种方法可以在 MacOS 中使用 NSToolbarItem 复制,但我还没有尝试过。这确实是一个笨拙的选择,因为它需要额外的 xib 对象并且可能不太明显发生了什么,但它可以工作。基本上,UIBarButtonItem / NSToolbarItem 只会充当目标/操作值的容器。

如果您不能子类化 NSControl,那么似乎首选的选项可能是拥有一个委托。这通常很好,除非一个控制器需要成为类的多个实例的委托,在这种情况下委托方法会变得更加乏味。另一种选择是让你的类有一个 block 属性,它是在 action 上执行的,但必须在代码中分配块,而不是在 Interface Builder 中设置。