Подтвердить что ты не робот

Как дублировать UIButton в Objective C?

Объект наследуется от NSObject.

Есть ли способ создать копию его как нового объекта?

4b9b3361

Ответ 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