2012-06-23 2 views
0

Я искал ответ на этот вопрос, и ответы, которые я нахожу, не работают.доступ к свойствам супервизора

У меня есть представление, которое является подклассом UIView, к которому я добавил свойство. Я хотел бы получить доступ к этому свойству из подпунктов, созданных этим представлением. Это возможно?

Я пробовал ссылаться на self.superview.propertyname, но я получаю сообщение об ошибке, что имя свойства не найдено на объекте типа UIView. Ну, ладно. Я понимаю, что, поскольку это подкласс UIView, это UIView, но как я могу узнать его о добавленной добавленной собственности?

ответ

2

У вас есть несколько вариантов, два из них являются:

1. Кастинг:

@implementation SubviewView 
- (void)blah 
{ 
    ((CustomView *)self.superview).property = ...` 
} 
@end 

2. Делегаты:

@protocol SubviewViewDelegate 
- (void)customView:(SubView *)sv modified:(...)value; 
@end 

@class SubView 
@property (nonatomic, weak) id <CustomViewDelegate> delegate; 
@end 

@implementation SubviewView 
- (void)blah 
{ 
    [self.delegate subView modified:...]; 
} 
@end 

@implementation CustomView 
- (void)subView:(SubView *)sv modified:(...)value 
{ 
    self.property = value; 
} 
@end 

Хотя второй вариант больше кода, я думаю, что он часто лучше подходит. Использование делегатов уменьшает сцепление и прекрасно работает с Law of Demeter. Для получения дополнительной информации см. Это documentation.

+0

Спасибо. Я думаю, что сейчас я буду использовать первый вариант, отчасти потому, что вчера вечером придумал то же самое решение в своем сне, а потом попробую другое решение позже. –

+0

На самом деле, для проекта, над которым я работаю, я считаю, что самым простым решением является добавление свойства в подкласс и его установка путем кодирования в представлении, которое создает экземпляры subviews. Это избыточно, но просто. И значение, о котором идет речь, не является чем-то, что изменится для этого проекта. Тем не менее, я буду учитывать ваши предложения в отношении будущих проектов. –

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