2009-10-11 6 views
3

Может ли Cocoahead объяснить, почему UIView и его подкласс не принимают протокол NSCopying?Почему UIView (или его подклассы) не принимает протокол NSCopying?

Я вижу, философски, почему UITouch не совместим с копией, поскольку это очень временный объект. По UIView, и это подклассы, особенно UIButton, кажутся такими, как должно быть скопировано.

Конечно, у Apple есть веские причины делать то, что они делают. Вы знаете их причину?

+0

Какие обстоятельства у вас есть, когда нужно скопировать представление? – Abizern

+0

Этот вопрос только информационный. Однако, чтобы ответить на ваш вопрос, проблема, вызвавшая мой вопрос, была связана с UIButtons. У меня был UIButton, который был почти как другая кнопка. Поэтому я хотел скопировать первую кнопку во вторую. а затем просто измените несколько различий. – SooDesuNe

ответ

4

Казалось бы, вопрос, который они задали, не был «Почему бы и нет?» но «Зачем?» Это мало смысла. Редко нужно копировать живой просмотр. Обычно представления шаблонов создаются с помощью протокола NSCoding (т. Е. С помощью Interface Builder), и это касается всего того, что нужно для копирования.

+3

Хорошим примером того, когда вы хотите сделать несколько копий объекта, как представление, находится в UITableView при создании дюжины или около того повторно используемых ячеек. Возможность копирования одного намного проще, чем множественные распределения UIViews/UIButtons/UILabels и т. Д. – mahboudz

+1

В качестве примера я создал шахматный фрагмент через подкласс UIView в IB. Теперь я хочу, чтобы клон видел все похожие шахматные фигуры. Помещение каждой части в свой собственный файл NIB кажется немного глупым (и неэффективным). * Очевидная вещь, которую нужно сделать, - это то, что предложил ОП, но, похоже, нет простого способа клонировать UIView. – wcochran

+1

@wcochran: Нет ничего, что помешало бы вам создать подкласс UIView, который реализует поведение, которое вы хотите, если это важно для вас. Требование к каждому классу просмотров, который любой пишет для реализации копирования, просто потому, что вам не нравятся nib, было бы глупо и неэффективно. – Chuck

4

Интересный вопрос. В дополнение к ответу Чака я хотел добавить, что причина в том, что Apple сделала это дизайнерское решение ... Просто так просто; нет реальной конкретной причины, но это было принято.

Я также могу предположить, что это решение могло быть принято потому, что UIView используется в качестве подкласса для нескольких других классов, и инженеры не хотели навязывать NSCopying принудительно в подклассах.

3

Потому что 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 
+0

Интересно знать, что UIVIews реализует NSCoding, но вы не относитесь к тому, чтобы фактически отвечать на вопрос. –

+1

@MarkL, думаю. Классы, которые принимают NSCopying, похоже, делают мелкие копии по соглашению. Неглубокая копия UIView обычно не полезна. Глубокая копия была бы непрактичной, потому что все свойства каждого подкласса UIView должны были поддерживать NSCopying. –