Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.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
Iphone 为什么';UIView(或它的子类)是否采用NSCopying协议?_Iphone_Cocoa Touch_Uikit_Nscopying - Fatal编程技术网

Iphone 为什么';UIView(或它的子类)是否采用NSCopying协议?

Iphone 为什么';UIView(或它的子类)是否采用NSCopying协议?,iphone,cocoa-touch,uikit,nscopying,Iphone,Cocoa Touch,Uikit,Nscopying,Cocoahead能否解释为什么UIView及其子类不采用NSCopying协议 我可以从哲学上理解为什么UITouch不兼容复制,因为它是一个非常临时的对象。通过UIView,它的子类,特别是UIButton,看起来应该能够被复制 当然,苹果有很好的理由这样做。你知道他们的理由吗?他们问的问题似乎不是“为什么不?”而是“为什么这样做?”这样做没有什么意义。很少需要复制实时视图。通常,模板视图是通过NSCoding协议(即使用Interface Builder)创建的,这就是可复制视图的好处。有

Cocoahead能否解释为什么UIView及其子类不采用NSCopying协议

我可以从哲学上理解为什么UITouch不兼容复制,因为它是一个非常临时的对象。通过UIView,它的子类,特别是UIButton,看起来应该能够被复制


当然,苹果有很好的理由这样做。你知道他们的理由吗?

他们问的问题似乎不是“为什么不?”而是“为什么这样做?”这样做没有什么意义。很少需要复制实时视图。通常,模板视图是通过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。