Объект наследуется от NSObject.
Есть ли способ создать копию его как нового объекта?
Объект наследуется от NSObject.
Есть ли способ создать копию его как нового объекта?
UIButton не соответствует NSCopying, поэтому вы не можете сделать копию через -copy.
Однако он соответствует NSCoding, поэтому вы можете архивировать текущий экземпляр, а затем распаковать копию.
NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject: button];
UIButton *buttonCopy = [NSKeyedUnarchiver unarchiveObjectWithData: archivedData];
Затем вам нужно будет назначить любые дополнительные свойства, которые не были перенесены в архив (например, делегат) по мере необходимости.
UIButton
не соответствует протоколу NSCopying
, поэтому вы можете скопировать его вручную. С другой стороны, это не плохо, потому что не совсем ясно, что значит копировать кнопку. Например, следует ли добавить копию кнопки в тот же вид, в котором находится оригинал? Должен ли он запускать те же методы при нажатии?
Чтобы добавить к Джиму ответ выше, используя категорию
@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];
}
}
Если он реализует протокол NSCopying
, тогда метод -copy
должен выполнить трюк.
Вы можете получить дополнительную информацию о методе -copy
и о том, как он работает с под-объектами на эталонном сайте ADC. Как упоминает Стивен Дарлингтон, вам необходимо реализовать протокол NSCopying
в вашем объекте.