Вопрос по iphone, objective-c – Как дублировать UIButton в Objective C?

22

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

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

Почему вы пытаетесь скопировать UIButton? Там может быть лучший путь ... Kendall Helmstetter Gelner
Вы дублируете кнопку, чтобы сделать, скажем, ряд кнопок. @JamesSkidmore Вот полный кодstackoverflow.com/a/26438692/294884 Fattie
Есть ли обратная сторона копирования UIButton? Мне нужно динамически создавать новые кнопки на основе существующей. James Skidmore

Ваш Ответ

6   ответов
4

UIButton не соответствуетNSCopying протокол, так что вы должны скопировать его вручную. С другой стороны, это не плохо, так как не совсем понятно, что значит копировать кнопку. Например, следует ли добавить кнопку «Копировать» в то же представление, в котором находится оригинал? Должен ли он запускать те же методы при постукивании?

0

-copy метод и как он работает с подобъектами на ссылочном сайте АЦП. Как отмечает Стивен Дарлингтон, вам необходимо реализоватьNSCopying протокол в вашем объекте.

документация

0

NSCopying протокол, то-copy метод должен сделать свое дело.

Я пытаюсь скопировать UIButton. Есть идеи? James Skidmore
0

let archivedData = NSKeyedArchiver.archivedData(withRootObject: button as Any)
let buttonCopy = NSKeyedUnarchiver.unarchiveObject(with: archivedData) as? UIButton
65

поэтому вы не можете сделать копию с помощью -copy.

Однако он соответствует NSCoding, поэтому вы можете заархивировать текущий экземпляр, а затем разархивировать «копию».

NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject: button];
UIButton *buttonCopy = [NSKeyedUnarchiver unarchiveObjectWithData: archivedData];

После этого вам придется назначать любые дополнительные свойства, которые не были перенесены в архив (например, делегат) по мере необходимости.

Отличная идея, спасибо Джим! James Skidmore
спасти любого, набрав ..stackoverflow.com/a/26438692/294884
Умная! Я бы, вероятно, просто добавил -копию через категорию, но это лучше. знак равно
Разве это не слишком медленно?
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];
    }
 }

Похожие вопросы