Передача установщиков / получателей переменной экземпляра в класс - PullRequest
1 голос
/ 04 февраля 2011

Я работаю над созданием подкласса UIView (который я называю MarqueeLabel), который анимирует вложенный вид UILabel ivar в виде выделения, когда текст UILabel слишком длинный для содержащего представления.

Я надеялся получить чистую реализацию, без необходимости писать методы в моем MarqueeLabel классе просто для установки / извлечения всех стандартных переменных экземпляра UILabel (текст, шрифт, цвет и т. Д.) UILabelИвар.Я нашел способ сделать это с помощью пересылки сообщений - все нераспознанные методы, отправленные на MarqueeLabel, передаются в UILabel ivar.В моем случае методы, не распознаваемые MarqueeLabel, являются методами, обычно используемыми с UILabel.

Однако при таком подходе есть некоторые проблемы:
1. Вы должны использовать [marqueeLabel setText:@"Label here"], а не marqueeLabel.text
2. Компилятор выдает предупреждения в приведенной выше строке, поскольку:

'MarqueeLabel' может не отвечать на '-setText:'

, который я мог бы игнорировать, но раздражал бы кого-либо еще.

Чтобы избежать этих проблем, есть ли способ «выдвинуть» методы ивара, чтобы онидоступный для чего-либо, использующего класс, и в то же время воздействующий на объект ivar?

Спасибо!

Примечание: Способ, который я настроил, может быть не лучшимсделать это тоже.Возможно, подкласс или продолжение класса UILabel было бы лучше, но я не смог понять, как анимация + обрезка (когда прокручиваемый текст выходит за пределы, содержащий UIView и исчезает), могут быть выполнены с помощью этих методов.

Примечание 2: Я знаю, что вы можете использовать marqueeLabel.subLabel.text, где subLabel - подпредставление UILabel.И это может быть направление, которое я выберу, но с тем же успехом могу посмотреть, есть ли лучшее решение!

1 Ответ

1 голос
/ 04 февраля 2011

Для свойств вы можете определить свойство в интерфейсе и использовать @dynamic в реализации, чтобы вам не приходилось создавать реализации-заглушки. Убедитесь, что вы также изменили значения valueForUndefinedKey: и setValue:forUndefinedKey: и перешли на свой ярлык.

Для любых методов, которые не являются частью свойства, вы можете использовать категорию для объявления метода без его реализации. Это избавит от предупреждений, но все равно будет использовать встроенную пересылку.

//MarqueeLabel.h
#import <UIKit/UIKit.h>
@interface MarqueeLabel : UIView {}
@property (nonatomic, copy) NSString *text;
@end
@interface MarqueeLabel (UILabelWrapper)
- (void)methodToOverride;
@end

//MarqueeLabel.m
#import "MarqueeLabel.h"
@implementation MarqueeLabel
@dynamic text;
- (id)valueForUndefinedKey:(NSString *)key {
    return [theLabel valueForKey:key];
}
- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
    [theLabel setValue:value forKey:key];
}
@end
...