Iphone 为什么';UIView(或它的子类)是否采用NSCopying协议?
Cocoahead能否解释为什么UIView及其子类不采用NSCopying协议 我可以从哲学上理解为什么UITouch不兼容复制,因为它是一个非常临时的对象。通过UIView,它的子类,特别是UIButton,看起来应该能够被复制Iphone 为什么';UIView(或它的子类)是否采用NSCopying协议?,iphone,cocoa-touch,uikit,nscopying,Iphone,Cocoa Touch,Uikit,Nscopying,Cocoahead能否解释为什么UIView及其子类不采用NSCopying协议 我可以从哲学上理解为什么UITouch不兼容复制,因为它是一个非常临时的对象。通过UIView,它的子类,特别是UIButton,看起来应该能够被复制 当然,苹果有很好的理由这样做。你知道他们的理由吗?他们问的问题似乎不是“为什么不?”而是“为什么这样做?”这样做没有什么意义。很少需要复制实时视图。通常,模板视图是通过NSCoding协议(即使用Interface Builder)创建的,这就是可复制视图的好处。有
当然,苹果有很好的理由这样做。你知道他们的理由吗?他们问的问题似乎不是“为什么不?”而是“为什么这样做?”这样做没有什么意义。很少需要复制实时视图。通常,模板视图是通过NSCoding协议(即使用Interface Builder)创建的,这就是可复制视图的好处。有趣的问题。除了Chuck的回答之外,我想补充一点,原因可能是苹果做出了设计决定。。。就这么简单,;没有真正的具体原因,但这是做出的决定
我还可以假设,之所以做出这个决定,可能是因为
UIView
被用作其他一些类的子类,工程师们不想强行将NSCopying
强加于这些子类 因为NSCopying
在对象图的深度(递归)拷贝方面不是很好。例如,[NSArray copy]
复制对象列表,而不是对象本身。通过NSCoding
可以更好地服务对象图。这恰好得到了UIView
的支持
如果要复制带有属性的自定义视图,则必须支持NSCoding
。例如:
@interface SKCustomCell : UITableViewCell
@property (strong, nonatomic) IBOutlet UILabel* nameLabel;
@property (strong, nonatomic) IBOutlet UIView* topView;
@end
static NSString* propertiesKey = @"SKCustomCellProperties";
@implementation SKCustomCell
@synthesize nameLabel;
@synthesize topView;
- (id) initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder: aDecoder];
[self setValuesForKeysWithDictionary: [aDecoder decodeObjectForKey: propertiesKey]];
return self;
}
- (void) encodeWithCoder:(NSCoder *)aCoder
{
[super encodeWithCoder: aCoder];
[aCoder encodeObject: [self dictionaryWithValuesForKeys: [[NSArray alloc] initWithObjects: @"nameLabel", @"topView", nil] forKey: propertiesKey];
}
@end
您在什么情况下需要复制视图?这个问题只是提供信息。但是,要回答您的问题,引发我问题的问题是一个带有UIButtons的问题。我有一个按钮,几乎和另一个按钮一模一样。所以我想把第一个按钮复制到第二个。然后只需修改其中的几个差异。创建十几个可重用单元时,UITableView就是一个很好的例子,说明您希望对一个对象(如视图)创建多个副本。能够复制一个比多次分配UIView/UIButtons/UILabels等容易得多。例如,我通过IB中的UIView子类创建了一个棋子。现在我希望克隆所有类似棋子的该视图。将每一块放在自己的NIB文件中似乎有点愚蠢(而且效率低下)。显而易见,要做的事情是OP建议的,但似乎没有简单的方法来克隆UIView。@wcochran:如果UIView子类对您如此重要,那么没有什么可以阻止您创建一个实现您想要的行为的UIView子类。仅仅因为你不喜欢NIB就要求任何人编写的每个视图类实现复制是愚蠢和低效的。“很少需要复制实时视图。”——除了苹果决定实现他们的集合——nsdictionary等——要求复制密钥。因此,您不能将UIView用作字典中的键,即使这是一个常见的用例。知道UIView实现NSCoding很有意思,但您不能将其与实际回答问题联系起来。@MarkL,我想我是这样做的。采用NSCopying的类似乎按照惯例进行浅拷贝。UIView的浅层副本通常不有用。深度复制是不切实际的,因为每个UIView子类的所有属性都需要支持NSCopying。