Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.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
Xcode 复制、克隆或复制UIView_Xcode_Ios - Fatal编程技术网

Xcode 复制、克隆或复制UIView

Xcode 复制、克隆或复制UIView,xcode,ios,Xcode,Ios,我有一个UIView,它通过界面生成器链接到UIViewController。 是否可以复制、克隆或复制此视图,以便我可以多次使用它?当然可以。该文件有一个完整的版本;它适用于UITableViewCell,但在这里也是一种很好的方法 根据视图的复杂性,您可能希望将其设置为自定义视图类,并为其拥有的任何子视图赋予自己的IBOutlet属性;在这种情况下,您需要将Interface Builder中视图的“类标识”设置为该类。然后,您的视图控制器可以通过例如myLoadedView.someLab

我有一个UIView,它通过界面生成器链接到UIViewController。
是否可以复制、克隆或复制此视图,以便我可以多次使用它?

当然可以。该文件有一个完整的版本;它适用于
UITableViewCell
,但在这里也是一种很好的方法


根据视图的复杂性,您可能希望将其设置为自定义视图类,并为其拥有的任何子视图赋予自己的
IBOutlet
属性;在这种情况下,您需要将Interface Builder中视图的“类标识”设置为该类。然后,您的视图控制器可以通过例如
myLoadedView.someLabel
访问任何给定的XIB加载视图上的这些视图,而不必使用上述链接文档建议的
[myLoadedView viewWithTag:3]

以下类别可能不是特别有效,但在一个项目中为我工作:

@implementation UIView (OPCloning)

- (id) clone {
    NSData *archivedViewData = [NSKeyedArchiver archivedDataWithRootObject: self];
    id clone = [NSKeyedUnarchiver unarchiveObjectWithData:archivedViewData];
    return clone;
}

@end
我不会实现-copy或-copyWithZone:因为苹果将来可能会这样做。
请注意,并非所有视图都在相同程度上实现归档。您肯定需要为要克隆的NSView子类的自定义属性实现NSCoding方法(否则,在克隆视图中将变为nil)。仍然比编写自定义克隆代码更容易。

这里有一个新方法可以使用:使用UIView的方法:

- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates

这是绘制视图的最快方法。iOS 7中提供。

您可以尝试使用以下Swift 3.0.1:

extension UIView{
func copyView() -> AnyObject{
    return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self))! as AnyObject
 }
}

UITableViewCell只加载了几次,从未被克隆过。我猜@geon是在暗示,通过多次解压nib来创建新对象似乎可以解决OP的需求,但它并不能像问题标题所暗示的那样作为问题的一般解决方案。这在代码中创建的UIView的一般情况下不起作用,例如,使用
[UIView alloc]initWithFrame:aFrame]。答案是正确的,但问题标题有误导性。这应该比重复加载nib更有效,因为它不会访问外部存储。在我的案例中,归档和取消归档一起花费的时间比从捆绑包(外部存储)加载nib多约20-25%。无论如何,我仍在寻找提高loadNibNamed性能的方法。在iOS 9中,克隆视图中的图像加载速度太慢。Nib加载基本上是在后台使用键控存档,因此性能应该是相同的。它不在这里的原因是Nib已经在构建过程中被归档,并且现在已经多次未归档。这段代码每次都执行归档和取消归档。如果缓存archivedViewData并重用它,您应该会看到类似的性能。但是,如果您需要克隆在程序运行时更改的实际特征,Nib应该更慢。注意:虽然这对于非常特定的用例是一个很好的解决方案,但此方法实际上不会创建与原始视图相同类型的新视图。它只会创建一个视图,该视图看起来像视图此时的样子(即它“截图”),您可以将其用作替代视图,例如在过渡效果期间或重新加载/重新创建视图时。