Xcode 复制、克隆或复制UIView
我有一个UIView,它通过界面生成器链接到UIViewController。Xcode 复制、克隆或复制UIView,xcode,ios,Xcode,Ios,我有一个UIView,它通过界面生成器链接到UIViewController。 是否可以复制、克隆或复制此视图,以便我可以多次使用它?当然可以。该文件有一个完整的版本;它适用于UITableViewCell,但在这里也是一种很好的方法 根据视图的复杂性,您可能希望将其设置为自定义视图类,并为其拥有的任何子视图赋予自己的IBOutlet属性;在这种情况下,您需要将Interface Builder中视图的“类标识”设置为该类。然后,您的视图控制器可以通过例如myLoadedView.someLab
是否可以复制、克隆或复制此视图,以便我可以多次使用它?当然可以。该文件有一个完整的版本;它适用于
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应该更慢。注意:虽然这对于非常特定的用例是一个很好的解决方案,但此方法实际上不会创建与原始视图相同类型的新视图。它只会创建一个视图,该视图看起来像视图此时的样子(即它“截图”),您可以将其用作替代视图,例如在过渡效果期间或重新加载/重新创建视图时。