我有从UIButton继承的类
public class MyButton: UIButton {
init(button: UIButton) {
}
}
但是我不明白如何通过该类的变量(在我的情况下是init方法中的“button”)初始化我的超类(在我的情况下是UIButton)?
Objective-C解决方案。
.h文件
@interface UIButton(ExtraIntialiser)
- (id)initWithButton:(UIButton *)button;
@end
@interface MyButton : UIButton
@property (nonatomic, strong) NSObject *myProperty;
- (id)initWithButton:(UIButton)button someProperty:(NSObject *)someProperty;
@end;
.m文件
@implementation UIButton(ExtraIntialiser)
- (id)initWithButton:(UIButton *)button {
self = [button copy];
return self;
}
@end
@implementation MyButton
- (id)initWithButton:(UIButton *)button someProperty:(NSObject *)someProperty {
self = [super initWithButton:button];
if (self != nil) {
self.myProperty = someProperty;
}
return self;
}
@end
答案 0 :(得分:1)
你不能在Swift中模仿这个确切的模式,因为这一行:
self = [button copy];
Swift不允许您分配给self
。如果您想继续使用此模式,则必须单独复制所需的属性。
此外,在Objective-C中,您使用的是类别。在Swift中,您当前的代码使用继承。如果您想模仿相同的模式,请改用 Swift extension 。
这是一种可能的实现方式。当然还有其他方法:
public class MyButton : UIButton {
var myProperty : NSObject?
init(button : UIButton) {
super.init()
commonInit(button)
}
init(button : UIButton, property : NSObject) {
self.myProperty = property
super.init()
commonInit(button)
}
func commonInit(button : UIButton) {
let controlStates = [UIControlState.Normal, UIControlState.Selected, UIControlState.Highlighted]
for controlState in controlStates {
setTitle(button.titleForState(controlState), forState: controlState)
setImage(button.imageForState(controlState), forState: controlState)
setBackgroundImage(button.backgroundImageForState(controlState), forState: controlState)
}
}
public required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
extension UIButton {
func buttonWithButton(button: UIButton) -> UIButton {
return button.copy() as UIButton
}
}
我的建议是重构您的代码。如果您真的需要这种级别的自定义,请创建一个按钮工厂对象,创建所需的按钮,并完全停止使用按钮复制。