Ios UIView可以复制吗?
简单地使用这种方式:Ios UIView可以复制吗?,ios,objective-c,uiview,copy,Ios,Objective C,Uiview,Copy,简单地使用这种方式: UIView* view2 = [view1 copy]; // view1 existed 这将导致模拟器无法启动此应用程序 试着保留 UIView* view2 = [view1 retain]; // view1 existed // modify view2 frame etc 对view2的任何修改都将应用于view1,我知道view2与view1共享相同的内存 为什么不能复制UIView?原因是什么?您的应用程序可能会因以下原因崩溃: [UIView co
UIView* view2 = [view1 copy]; // view1 existed
这将导致模拟器无法启动此应用程序
试着保留
UIView* view2 = [view1 retain]; // view1 existed
// modify view2 frame etc
对view2
的任何修改都将应用于view1
,我知道view2
与view1
共享相同的内存
为什么不能复制
UIView
?原因是什么?您的应用程序可能会因以下原因崩溃:
[UIView copyWithZone:]: unrecognized selector sent to instance 0x1c6280
原因是UIView没有实现复制协议,因此UIView中没有
copyWithZone
选择器。您可以将此方法设置为:
-(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];
这可能对你有用。。。归档视图,然后立即取消归档。这将为您提供视图的深度副本:
id copyOfView =
[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:originalView]];
您可以创建UIView扩展。在下面的示例swift代码段中,函数copyView返回一个AnyObject,这样您就可以复制UIView的任何子类,即UIImageView。 如果只想复制UIView,可以将返回类型更改为UIView
//MARK: - UIView Extensions
extension UIView
{
func copyView<T: UIView>() -> T {
return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self)) as! T
}
}
UIView
未实现NSCoping
协议,请参见UIView.h中的声明:
@接口UIView:UIResponder
因此,如果我们想要有一个类似于复制
的方法,我们需要在一个或多个类别中实现NSCoping
协议。对于swift3.0.1:
extension UIView{
func copyView() -> AnyObject{
return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self))! as AnyObject
}
}
我应该如何实现UIView的副本?因此,如果您有UIView的某个组合,并想多次使用它,您将需要对此类UIView进行子类化?是的,使用类级工厂方法对其进行子类化或分类,这些方法返回该视图的预配置实例。这看起来有点像是一种黑客行为,但工作起来就像一场梦。下面ssj的答案基本上是一个“复制构造函数”,对于小型类来说很好。您可以使用obj-c运行时一次复制所有属性。。这更容易;)这是可行的,但即使对于微不足道的视图树来说似乎也很慢。它是可行的,但要小心!它没有为@IBOutlets设置值,所有这些值在“复制”后都为零。这似乎忽略了
UIImageView
s:(谢谢,效果很好!还请注意,复制的视图没有superview(父视图),没有约束,也没有手势识别器(如果父视图有)。这并不是回答问题。如果标签有其他自定义参数,如numberOfLines或tag,该怎么办?是否设置所有属性?谢谢,效果很好!另外请注意,复制的视图没有superview(父视图)、约束和手势识别器(如果父视图有)。
extension UIView{
func copyView() -> AnyObject{
return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self))! as AnyObject
}
}