如何在 Objective C 中复制 UIButton?

Posted

技术标签:

【中文标题】如何在 Objective C 中复制 UIButton?【英文标题】:How to duplicate a UIButton in Objective C? 【发布时间】:2009-07-07 15:04:46 【问题描述】:

对象继承自 NSObject。

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

【问题讨论】:

为什么要复制 UIButton?或许有更好的路... 复制 UIButton 有缺点吗?我需要根据现有按钮动态创建新按钮。 复制一个按钮来制作一排按钮。 @JamesSkidmore 这是完整代码***.com/a/26438692/294884 【参考方案1】:

UIButton 不符合 NSCopying,所以无法通过 -copy 进行复制。

但是,它确实符合 NSCoding,因此您可以存档当前实例,然后取消存档“副本”。

NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject: button];
UIButton *buttonCopy = [NSKeyedUnarchiver unarchiveObjectWithData: archivedData];

之后,您必须根据需要分配未在存档中保留的任何其他属性(例如委托)。

【讨论】:

聪明!我可能只是通过一个类别添加了 -copy,但这更好。 =) 这不是有点慢吗?【参考方案2】:

UIButton 不符合NSCopying 协议,所以你必须手动复制它。另一方面,这并不是一件坏事,因为复制按钮的含义并不完全清楚。例如,是否应该将按钮副本添加到原始视图所在的同一视图中?是否应该在点击时触发相同的方法?

【讨论】:

【参考方案3】:

使用类别添加到吉姆上面的答案

 @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];
    
 

【讨论】:

【参考方案4】:

如果它实现了NSCopying 协议,那么-copy 方法应该可以解决问题。

【讨论】:

我正在尝试复制 UIButton。有什么想法吗?【参考方案5】:

您可以在 ADC 参考网站上获得有关 -copy 方法以及它如何与子对象一起工作的更多信息。正如 Stephen Darlington 所提到的,您需要在您的对象中实现 NSCopying 协议。

documentation

【讨论】:

【参考方案6】:

Swift 3/4 版本将是:

let archivedData = NSKeyedArchiver.archivedData(withRootObject: button as Any)
let buttonCopy = NSKeyedUnarchiver.unarchiveObject(with: archivedData) as? UIButton

【讨论】:

以上是关于如何在 Objective C 中复制 UIButton?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Objective C 在 iOS 上本地下载和保存文件? [复制]

如何在 Objective C 中执行 chmod()

如何在Objective c中获取目录中文件的创建日期

将Swift类导入Objective c [复制]

如何在 iOS(Swift 或 Objective C)中实现这样的套接字调用?

需要使用 Objective C 将新的键和值添加到 Plist 中? [复制]