Iphone 如何在Objective C中复制UIButton?
对象继承自NSObjectIphone 如何在Objective C中复制UIButton?,iphone,objective-c,Iphone,Objective C,对象继承自NSObject 有没有一种方法可以将它的副本创建为新对象?如果它实现了NSCopying协议,那么-copy方法应该可以做到这一点。您可以获得有关-copy方法以及它如何与ADC参考站点上的子对象一起工作的更多信息。正如Stephen Darlington提到的,您需要在对象中实现NSCopying协议 ui按钮不符合NSCopying,因此无法通过-copy进行复制 但是,它确实符合NSCoding,因此您可以归档当前实例,然后取消归档“副本” NSData *archivedDa
有没有一种方法可以将它的副本创建为新对象?如果它实现了
NSCopying
协议,那么-copy
方法应该可以做到这一点。您可以获得有关-copy
方法以及它如何与ADC参考站点上的子对象一起工作的更多信息。正如Stephen Darlington提到的,您需要在对象中实现NSCopying
协议
ui按钮不符合NSCopying,因此无法通过-copy进行复制 但是,它确实符合NSCoding,因此您可以归档当前实例,然后取消归档“副本”
NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject: button];
UIButton *buttonCopy = [NSKeyedUnarchiver unarchiveObjectWithData: archivedData];
之后,您必须根据需要分配存档中未结转的任何其他属性(例如代理)。
UIButton
不符合NSCopying
协议,因此您必须手动复制。另一方面,这并不是一件坏事,因为复制一个按钮到底意味着什么还不清楚。例如,是否应将按钮副本添加到原始视图中的同一视图?点击时是否触发相同的方法?使用类别添加到上面Jim的答案中
@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
我想复制一个按钮。有什么想法吗?你为什么要复制一个按钮?可能有更好的方法…复制UIButton有缺点吗?我需要在现有按钮的基础上动态创建新按钮。复制一个按钮可以生成一行按钮@JamesSkidmore这里有完整的代码!我可能只是通过一个类别添加了-copy,但这样更好。=)这不是有点慢吗?