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

22

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

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

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

Ваш Ответ

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];
    }
 }

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