我有一个通过Interface Builder链接到UIViewController的UIView。 是否可以复制,克隆或复制此视图,以便我可以多次使用它?
答案 0 :(得分:30)
以下类别可能效率不高,但在一个项目中为我工作:
@implementation UIView (OPCloning)
- (id) clone {
NSData *archivedViewData = [NSKeyedArchiver archivedDataWithRootObject: self];
id clone = [NSKeyedUnarchiver unarchiveObjectWithData:archivedViewData];
return clone;
}
@end
我不会实现-copy或-copyWithZone:因为Apple将来可能会这样做。 请注意,并非所有视图都实现了相同范围的归档。您肯定需要为要克隆的NSView子类的自定义属性实现NSCoding方法(否则将在克隆视图中变为nil)。比编写自定义克隆代码更容易。
答案 1 :(得分:14)
以下是您可以使用的新方法:使用UIView的方法:
- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates
这是绘制视图的最快方法。适用于iOS 7。
答案 2 :(得分:3)
您可以尝试使用下面的Swift 3.0.1:
extension UIView{
func copyView() -> AnyObject{
return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self))! as AnyObject
}
}
答案 3 :(得分:1)
不确定。文档有good example of how to achieve that;它适用于UITableViewCell
,但也是一种在这里使用的好方法。
根据视图的复杂程度,您可能希望将其设置为自定义视图类,并为其拥有的任何子视图提供自己的IBOutlet
属性;在这种情况下,您将Interface Builder中的视图的“类标识”设置为该类。然后,您的视图控制器可以通过例如myLoadedView.someLabel
访问任何给定的XIB加载视图上的那些视图,而不必像前面提到的文档所建议的那样使用例如[myLoadedView viewWithTag:3]
。