Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.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
Ios UIView可以复制吗?_Ios_Objective C_Uiview_Copy - Fatal编程技术网

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
 }
}