该对象继承自NSObject类。
是否有一种方法可以创建该对象的副本作为一个新的对象?
该对象继承自NSObject类。
是否有一种方法可以创建该对象的副本作为一个新的对象?
UIButton不符合NSCopying要求,所以无法通过-copy方法进行复制。
但是,它符合NSCoding要求,因此您可以对当前实例进行归档,然后解档一个“副本”。
NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject: button];
UIButton *buttonCopy = [NSKeyedUnarchiver unarchiveObjectWithData: archivedData];
之后,您需要根据需要分配任何未在存档中保留的其他属性(例如委托)。UIButton
没有遵循 NSCopying
协议,因此您需要手动复制它。另一方面,这并不是一件坏事,因为复制按钮的含义并不是很清楚。例如,复制按钮应该添加到与原始按钮相同的视图中吗?在点击时是否应该触发相同的方法?
@implementation UIButton (NSCopying)
- (id)copyWithZone:(NSZone *)zone {
NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:self];
UIButton *buttonCopy = [NSKeyedUnarchiver unarchiveObjectWithData: archivedData];
return buttonCopy;
}
@end
for (id target in button.allTargets) {
NSArray *actions = [button actionsForTarget:target forControlEvent:UIControlEventTouchUpInside];
for (NSString *action in actions) {
[newButton addTarget:target action:NSSelectorFromString(action) forControlEvents:UIControlEventTouchUpInside];
}
}
Swift 3/4 版本将会是:
let archivedData = NSKeyedArchiver.archivedData(withRootObject: button as Any)
let buttonCopy = NSKeyedUnarchiver.unarchiveObject(with: archivedData) as? UIButton
NSCopying
协议,那么-copy
方法就可以解决问题了。-copy
方法及其如何与子对象一起使用的更多信息。正如Stephen Darlington所提到的,您需要在对象中实现NSCopying
协议。