Подвид, использующий методы супервизора

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


person Matias Frank Jensen    schedule 16.07.2014    source источник


Ответы (4)


предположим, что ваше имя класса super View

MainView.h

название подвида

SubView.h

Итак, в подклассе вы можете сделать

MainView *myMainView = (Mainview *)[self superview];
[myMainView someMethod];

Убедитесь, что someMethod является общедоступным методом.

Другим способом вы могли бы иметь ссылку на все представление, установленное тегом, например.

myMainView.tag = 100; or self.tag = 100;

В подвиде вы можете сделать

   MainView *myMainView = (Mainview *)[self viewWithTag:100];
   [myMainView someMethod];
person Dipu Rajak    schedule 16.07.2014

странная конструкция, но просто вызовите метод:

внутри представления у вас есть self.superview

поскольку self.superview является UIView *, компилятор будет утверждать, что недопустимо вызывать для него метод XYZ. Приведите его к идентификатору или имени вашего класса, чтобы использовать его.

e.g.

[(id)self.superview myMethod];

или даже

id myValue = [(id)self.superview myMethod:param1];


person Daij-Djan    schedule 16.07.2014

Один из методов заключается в использовании делегатов.

@protocol ButtonHandlingDelegate <NSObject>
- (void) subviewButtonWasPressed;
@end

В вашем Subview добавьте следующее: @property (nonatomic, weak) id selectionDelegate;

Когда подпредставление создано, установите делегата в суперпредставление.

Определить Superview как делегата в файле .h

@interface SuperView : UIView <ButtonHandlingDelegate>

в файле Superview .m

- (void) subviewButtonWasPressed{
     // Do somethign about it
}
person hackerinheels    schedule 16.07.2014

Все перечисленные ответы являются хакерскими и плохими. Вы должны использовать делегирование через ViewController подвида. Что вам нужно сделать, так это создать протокол для вашего подпредставления с помощью метода void, называемого чем-то вроде specialButtonPressedOnView:(SUBVIEWCLASS *)view. Затем в контроллере представления подпредставления вы должны сделать себя делегатом для этого протокола и ответить на метод делегата из контекста VC.

Использование self.superview - плохая идея, потому что вы не можете гарантировать, каким будет ваш superview, и, как правило, слепой вызов метода для объектов (ОСОБЕННО тех, которые приведены к id) - действительно плохая идея.

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

Одной из основных частей шаблона проектирования MVC является обеспечение возможности многократного использования ваших представлений и их полной независимости. Это всего лишь структуры, в которые вы можете внедрить свой контент, на что они будут реагировать красивым пользовательским интерфейсом, и им не нужно ничего знать о том, что им передается, и им не нужно обращаться за помощью к другим представлениям. Таким образом, либо использование делегирования через ViewController подвида, либо создание подклассов, вероятно, является лучшим направлением. Оба метода сохраняют шаблон MVC и намного безопаснее, чем другие предложения.

person Tsvi Tannin    schedule 16.07.2014
comment
В основном я согласен, что я и хотел выразить словами «странная конструкция». -- НО я также давно перестал рассматривать MVC как черно-белый мир -- ЕСТЬ ситуации, когда вы хотите действовать против правил. например когда вы создаете представление, которое на самом деле представляет собой 1 представление контейнера и N подпредставлений, и где вы не хотите раскрывать подпредставления. - person Daij-Djan; 17.07.2014