Как дублировать UIButton в Objective C?
Объект наследуется от NSObject.
Есть ли способ создать копию его как нового объекта?
Ответы
Ответ 1
UIButton не соответствует NSCopying, поэтому вы не можете сделать копию через -copy.
Однако он соответствует NSCoding, поэтому вы можете архивировать текущий экземпляр, а затем распаковать копию.
NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject: button];
UIButton *buttonCopy = [NSKeyedUnarchiver unarchiveObjectWithData: archivedData];
Затем вам нужно будет назначить любые дополнительные свойства, которые не были перенесены в архив (например, делегат) по мере необходимости.
Ответ 2
UIButton
не соответствует протоколу NSCopying
, поэтому вы можете скопировать его вручную. С другой стороны, это не плохо, потому что не совсем ясно, что значит копировать кнопку. Например, следует ли добавить копию кнопки в тот же вид, в котором находится оригинал? Должен ли он запускать те же методы при нажатии?
Ответ 3
Чтобы добавить к Джиму ответ выше, используя категорию
@implementation UIButton (NSCopying)
- (id)copyWithZone:(NSZone *)zone {
NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:self];
UIButton *buttonCopy = [NSKeyedUnarchiver unarchiveObjectWithData: archivedData];
return buttonCopy;
}
@end
если вы хотите скопировать все действия с одной кнопки на другую, добавьте что-то вроде этого:
for (id target in button.allTargets) {
NSArray *actions = [button actionsForTarget:target forControlEvent:UIControlEventTouchUpInside];
for (NSString *action in actions) {
[newButton addTarget:target action:NSSelectorFromString(action) forControlEvents:UIControlEventTouchUpInside];
}
}
Ответ 4
Если он реализует протокол NSCopying
, тогда метод -copy
должен выполнить трюк.
Ответ 5
Вы можете получить дополнительную информацию о методе -copy
и о том, как он работает с под-объектами на эталонном сайте ADC. Как упоминает Стивен Дарлингтон, вам необходимо реализовать протокол NSCopying
в вашем объекте.
documentation