我有一个
@IBDesignable
class Fancy:UIButton
我想要addTarget(self, action:#selector(blah),
forControlEvents: UIControlEvents.TouchUpInside)
那么在UIButton中应该在哪里完成呢?addTarget
的最佳位置在哪里?1-我看到了
layoutSubviews
的建议-对吗?注意-实验表明
layoutSubviews
的问题在于,只要事情四处移动,就可以经常调用它。多次“addTarget”将是一个坏主意。2-
didMoveToSuperview
是另一个建议。3-(其中之一)的某个地方?
注意-如果您在Init中进行实验,则会发现一个令人着迷的问题。在初始化期间,尚未实际设置IBInspectable变量! (因此,例如,我根据IBInspectable设置的控件的“样式”进行分支;它不能像@IBInspectable一样起作用:运行时将不起作用!)
4-其他地方???
我尝试在Init中执行此操作,并且效果很好。但这打破了可编辑器在编辑器中的工作。
经过反复研究,我想到了这一点(由于某种原因,必须同时包含两者吗?)
@IBDesignable
class DotButton:UIButton
{
@IBInspectable var mainColor ... etc.
required init?(coder decoder: NSCoder)
{
super.init(coder: decoder)
addTarget(self, action:#selector(blah),
forControlEvents: UIControlEvents.TouchUpInside)
}
override init(frame:CGRect)
{
super.init(frame:frame)
}
我不知道为什么行得通,而且我不明白为什么会有两个不同的初始化例程。在UIButton中包含
addTarget
的正确方法是什么? 最佳答案
如何实现awakeFromNib
并在那里执行呢?
https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Protocols/NSNibAwaking_Protocol/#//apple_ref/occ/instm/NSObject/awakeFromNib
您还可以在Interface Builder的上下文中运行代码时有条件地运行(或不运行)代码:
#if !TARGET_INTERFACE_BUILDER
// this code will run in the app itself
#else
// this code will execute only in IB
#endif
(请参阅http://nshipster.com/ibinspectable-ibdesignable/)