Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何在Objective C中复制UIButton?_Iphone_Objective C - Fatal编程技术网

Iphone 如何在Objective C中复制UIButton?

Iphone 如何在Objective C中复制UIButton?,iphone,objective-c,Iphone,Objective C,对象继承自NSObject 有没有一种方法可以将它的副本创建为新对象?如果它实现了NSCopying协议,那么-copy方法应该可以做到这一点。您可以获得有关-copy方法以及它如何与ADC参考站点上的子对象一起工作的更多信息。正如Stephen Darlington提到的,您需要在对象中实现NSCopying协议 ui按钮不符合NSCopying,因此无法通过-copy进行复制 但是,它确实符合NSCoding,因此您可以归档当前实例,然后取消归档“副本” NSData *archivedDa

对象继承自NSObject


有没有一种方法可以将它的副本创建为新对象?

如果它实现了
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,但这样更好。=)这不是有点慢吗?