2013-05-22 3 views
1

Я пытаюсь дать всем своим взглядам новое свойство под названием newProperty. Поскольку все взгляды имели бы это, было бы разумнее добавить его в суперкласс. В этом случае я хочу добавить newProperty в UIView, так что все подклассы UIView (UIWindow, UIPickerView, UITabBar и т. Д.) Наследуют его. Так это возможно?Добавление свойства в суперкласс UIView

ответ

3

Когда свойство необходимо подкладочный переменную экземпляра, можно использовать соответствующий объект:

How do I use objc_setAssociatedObject/objc_getAssociatedObject inside an object?

What is objc_setAssociatedObject() and in what cases should it be used?

http://darkdust.net/writings/objective-c/attaching-objects

... но вы можете думать, что это через прежде чем использовать его.

Если ваше свойство не требует переменной экземпляра, см. Ответ Луки.

1

Напишите категорию на UIView.

В Xcode, перейдите Файл -> Создать -> Файл, а затем выберите «Объектив-C Категория» из строки Cocoa Touch в разделе iOS. Убедитесь, что категория включена в UIView, дайте ей имя, и вы ушли.

Здесь вы можете добавить свойства или даже методы экземпляра, которые, при условии, что вы импортируете категорию в префиксный файл приложения, будут доступны все классы, наследующие UIView.

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

ОП не указал, какое свойство они хотят добавить в UIView, поэтому я сделал предположение, что категории будет достаточно. Я уверен, что все правильно с комментариями ниже re: хранилище данных по действительно настраиваемому свойству.

Я не оцениваю нисходящие потоки, когда на самом деле цель ОП не сделана настолько ясной, что касается использования их «newProperty».

например: Категория по UIView, называемая положением. (UIView + Position)

UIView+Position.h 

@interface UIView (Position) 

-(CGFloat)left; 
-(CGFloat)right; 
-(CGFloat)top; 
-(CGFloat)bottom; 

@property (nonatomic) CGFloat left; 
@property (nonatomic) CGFloat right; 
@property (nonatomic) CGFloat top; 
@property (nonatomic) CGFloat bottom; 

@end 



UIView+Position.m 

#import "UIView+Position.h" 

@implementation UIView (Position) 

-(CGFloat)left 
{ 
    return self.frame.origin.x; 
} 

-(CGFloat)right 
{ 
    return self.frame.origin.x + self.frame.size.width; 
} 

-(CGFloat)top 
{ 
    return self.frame.origin.y; 
} 

-(CGFloat)bottom 
{ 
    return self.frame.origin.y + self.frame.size.height; 
} 

@end 
+1

Категория может добавлять методы к классу, но не к собственности. Это связано с тем, что категория не может добавить резервное хранилище/ivar для манипулятора и сеттера. –

+1

Вы не можете добавить 'iVars'. См. Http://stackoverflow.com/q/6162589/667586 http://stackoverflow.com/a/6162619/667586 –

+1

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

Смежные вопросы