我有一个

@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中执行此操作,并且效果很好。但这打破了可编辑器在编辑器中的工作。
ios - 在UIButton中的哪里初始化目标?特别关照IBDesignable-LMLPHP
经过反复研究,我想到了这一点(由于某种原因,必须同时包含两者吗?)
@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/)

10-06 13:23