只需使用这种方式:
UIView* view2 = [view1 copy]; // view1 existed
这将导致模拟器无法启动此应用。
尝试保留,
UIView* view2 = [view1 retain]; // view1 existed
// modify view2 frame etc
对的任何修改view2
将适用于view1
我理解与view2
共享相同的记忆view1
。
为什么不能UIView
复制?是什么原因?
Answers:
您的应用可能会崩溃,并显示以下内容:
[UIView copyWithZone:]: unrecognized selector sent to instance 0x1c6280
原因是UIView没有实现复制协议,因此copyWithZone
UIView中没有选择器。
这可能对您有用...将视图存档,然后立即取消存档。这应该给您一个视图的深层副本:
id copyOfView =
[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:originalView]];
UIImageView
s :(
您可以进行UIView扩展。在下面的示例快速代码段中,函数copyView返回一个AnyObject,因此您可以复制UIView的任何子类,即UIImageView。如果你想复制只UIViews你可以改变返回类型的UIView。
//MARK: - UIView Extensions
extension UIView
{
func copyView<T: UIView>() -> T {
return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self)) as! T
}
}
用法示例:
let sourceView = UIView()
let copiedView = sourceView.copyView()
对于swift3.0.1:
extension UIView{
func copyView() -> AnyObject{
return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self))! as AnyObject
}
}
您可以使方法如下所示:
-(UILabel*)copyLabelFrom:(UILabel*)label{
//add whatever needs to be copied
UILabel *newLabel = [[UILabel alloc]initWithFrame:label.frame];
newLabel.backgroundColor = label.backgroundColor;
newLabel.textColor = label.textColor;
newLabel.textAlignment = label.textAlignment;
newLabel.text = label.text;
newLabel.font = label.font;
return [newLabel autorelease];
}
然后,您可以将ivar设置为返回值,并像这样保留它:
myLabel = [[self copyLabelFrom:myOtherLabel] retain];