Как сделать копию для UILabel? - PullRequest
14 голосов
/ 03 января 2012

у меня IBOutlet UILabel *label;

и я хочу сделать это

UILabel *label = [titleLabel copy];
label.text = @"Clone";
titleLabel.text = @"Original";
NSLog(@"label : %@, title : %@",label.text,titleLabel.text);

и это исключение броска

* Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: '- [UILabel copyWithZone:]: нераспознанный селектор, отправленный экземпляру 0x6a4a450' * Первый вызов стека вызовов: (0x126f052 0x1823d0a 0x1270ced 0x11d5f00 0x11d5ce2 0x1271bd9 0x2ed6 0x1270e1a 0x2851 0x28264e 0x1e2a73 0x1e2ce2 0x1e2ea8 0x1e9d9a 0x24af 0x1ba9d6 0x1bb8a6 0x1ca743 0x1cb1f8 0x1beaa9 0x215cfa9 0x12431c5 0x11a8022 0x11a690a 0x11a5db4 0x11a5ccb 0x1bb2a7 0x1bca9b 0x21c2 0x2135)

Ответы [ 4 ]

24 голосов
/ 03 января 2012

Нет открытого Apple API для глубокого копирования UILabel.Лучше всего сделать вспомогательный метод, который будет копировать все части, которые вас интересуют.

- (UILabel *)deepLabelCopy:(UILabel *)label {
    UILabel *duplicateLabel = [[UILabel alloc] initWithFrame:label.frame];
    duplicateLabel.text = label.text;
    duplicateLabel.textColor = label.textColor;
    // etc... anything else which is important to your ULabel

    return [duplicateLabel autorelease];
}

Если вы хотите использовать его по всей базе кода, вы можете изменить его на статический метод и поместить его вкакой-то класс полезности.Если бы вы назвали класс LabelUtils, вы могли бы сделать что-то вроде ...

+ (UILabel *)deepLabelCopy(UILabel *)label {
    // ...
}

и вызываться с использованием UILabel *dupLabel = [LabelUtils deepLabelCopy:origLabel];

14 голосов
/ 27 мая 2013

Я рекомендую использовать объединенную версию Ответа 1 и Ответа 2:

- (UILabel *)copyLabel:(UILabel *)label {
    NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject: label];
    UILabel* copy = [NSKeyedUnarchiver unarchiveObjectWithData: archivedData];
    return copy;
}

Затем просто используйте что-то вроде

UILabel* labelcopy = [self copyLabel:originalLabel];

в своем коде.

13 голосов
/ 24 апреля 2013

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

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

NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject: label];
UILabel *labelCopy =   [NSKeyedUnarchiver unarchiveObjectWithData: archivedData];

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

7 голосов
/ 18 мая 2017

Swift 3 Solution

Я создал его как расширение UILabel.

extension UILabel {
    func createCopy() -> UILabel {
        let archivedData = NSKeyedArchiver.archivedData(withRootObject: self)
        return NSKeyedUnarchiver.unarchiveObject(with: archivedData) as! UILabel
    }
}

Как использовать

let anotherNameLabel = nameLabel.createCopy()

Дополнительная информация - Какэта работа?

NSKeyedArchiver возьмет объект из памяти и преобразует его в текст.«Ключ» означает, что он использует слова для описания свойств этого объекта, например «LabelFrame», «LabelText» и т. Д. (Это ложные ключи.) В других технологиях это также называется сериализацией.делает обратное.Он возьмет этот текст и создаст объект.Здесь мы берем этот объект (Any?) и конвертируем его в UILabel.

...