Igo*_*iuc 14 iphone xcode uikit nsobject ios
我有 IBOutlet UILabel *label;
我想这样做
UILabel *label = [titleLabel copy];
label.text = @"Clone";
titleLabel.text = @"Original";
NSLog(@"label : %@, title : %@",label.text,titleLabel.text);
Run Code Online (Sandbox Code Playgroud)
这抛出异常
*终止应用程序由于未捕获的异常'NSInvalidArgumentException',原因是: ' - [的UILabel copyWithZone:]:无法识别的选择发送到实例0x6a4a450'*第一掷调用堆栈:(0x126f052 0x1823d0a 0x1270ced 0x11d5f00 0x11d5ce2 0x1271bd9 0x2ed6 0x1270e1a 0x2851 0x28264e 0x1e2a73 0x1e2ce2 0x1e2ea8 0x1e9d9a 0x24af 0x1ba9d6 0x1bb8a6 0x1ca743 0x1cb1f8 0x1beaa9 0x215cfa9 0x12431c5 0x11a8022 0x11a690a 0x11a5db4 0x11a5ccb 0x1bb2a7 0x1bca9b 0x21c2 0x2135)
DBD*_*DBD 24
没有公开的Apple API可以深层复制UILabel.最好的办法是制作一个帮助方法,复制你关心的所有部分.
- (UILabel *)deepLabelCopy:(UILabel *)label {
UILabel *duplicateLabel = [[UILabel alloc] initWithFrame:label.frame];
duplicateLabel.text = label.text;
duplicateLabel.textColor = label.textColor;
// etc... anything else which is important to your ULabel
return [duplicateLabel autorelease];
}
Run Code Online (Sandbox Code Playgroud)
如果要在代码库中使用它,可以将其更改为静态方法并将其放在某种实用程序类中.如果你给这个班级命名,LabelUtils你可以做点什么......
+ (UILabel *)deepLabelCopy(UILabel *)label {
// ...
}
Run Code Online (Sandbox Code Playgroud)
并将被称为使用 UILabel *dupLabel = [LabelUtils deepLabelCopy:origLabel];
its*_*e69 14
我建议使用Answer 1和Answer 2的合并版本:
- (UILabel *)copyLabel:(UILabel *)label {
NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject: label];
UILabel* copy = [NSKeyedUnarchiver unarchiveObjectWithData: archivedData];
return copy;
}
Run Code Online (Sandbox Code Playgroud)
然后简单地使用像
UILabel* labelcopy = [self copyLabel:originalLabel];
Run Code Online (Sandbox Code Playgroud)
在你的代码中.
KIO*_*KIO 13
UILabel不符合NSCopying,因此您无法通过-copy制作副本.
但它确实符合NSCoding,因此您可以归档当前实例,然后取消归档"副本".
NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject: label];
UILabel *labelCopy = [NSKeyedUnarchiver unarchiveObjectWithData: archivedData];
Run Code Online (Sandbox Code Playgroud)
之后,您必须根据需要分配存档中未携带的任何其他属性(例如代理).
我创建它作为扩展UILabel.
extension UILabel {
func createCopy() -> UILabel {
let archivedData = NSKeyedArchiver.archivedData(withRootObject: self)
return NSKeyedUnarchiver.unarchiveObject(with: archivedData) as! UILabel
}
}
Run Code Online (Sandbox Code Playgroud)
let anotherNameLabel = nameLabel.createCopy()
Run Code Online (Sandbox Code Playgroud)
NSKeyedArchiver将从内存中取出一个对象并将其转换为文本."Keyed"表示它使用单词来描述此对象的属性,如"LabelFrame","LabelText"等(这些都是假密钥.)这也称为其他技术中的序列化.
NSKeyedUnarchiver反其道而行之.它将采用该文本并构建一个对象.在这里我们采用该对象(Any?)并将其转换为UILabel.
| 归档时间: |
|
| 查看次数: |
16410 次 |
| 最近记录: |