【发布时间】:2011-02-15 13:12:08
【问题描述】:
我有一个通过 Interface Builder 链接到 UIViewController 的 UIView。 是否可以复制、克隆或复制此视图以便我可以多次使用它?
【问题讨论】:
我有一个通过 Interface Builder 链接到 UIViewController 的 UIView。 是否可以复制、克隆或复制此视图以便我可以多次使用它?
【问题讨论】:
以下类别可能不是特别有效,但在一个项目中对我有用:
@implementation UIView (OPCloning)
- (id) clone {
NSData *archivedViewData = [NSKeyedArchiver archivedDataWithRootObject: self];
id clone = [NSKeyedUnarchiver unarchiveObjectWithData:archivedViewData];
return clone;
}
@end
我不会实现 -copy 或 -copyWithZone:,因为 Apple 将来可能会这样做。 请注意,并非所有视图都以相同的程度实现归档。您肯定需要为要克隆的 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
}
}
【讨论】:
当然。该文档有一个good example of how to achieve that;它适用于UITableViewCell,但也是在这里使用的好方法。
根据视图的复杂性,您可能希望将其设为自定义视图类,并为其拥有的任何子视图赋予其自己的IBOutlet 属性;在这种情况下,您需要将 Interface Builder 中视图的“类标识”设置为该类。然后,您的视图控制器可以通过例如myLoadedView.someLabel 访问任何给定的加载了 XIB 的视图上的这些视图,而不必按照上述文档的建议使用例如 [myLoadedView viewWithTag:3]。
【讨论】:
[UIView alloc] initWithFrame:aFrame];。答案是正确的,但问题标题具有误导性。