Как подпредставление может получить доступ к методам из своего суперпредставления? У меня есть кнопка, и при нажатии я хотел бы, чтобы кнопка вызывала метод из своего супервизора, но я не знаю, как это сделать.
Подвид, использующий методы супервизора
Ответы (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];
странная конструкция, но просто вызовите метод:
внутри представления у вас есть self.superview
поскольку self.superview является UIView *, компилятор будет утверждать, что недопустимо вызывать для него метод XYZ. Приведите его к идентификатору или имени вашего класса, чтобы использовать его.
e.g.
[(id)self.superview myMethod];
или даже
id myValue = [(id)self.superview myMethod:param1];
Один из методов заключается в использовании делегатов.
@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
}
Все перечисленные ответы являются хакерскими и плохими. Вы должны использовать делегирование через ViewController подвида. Что вам нужно сделать, так это создать протокол для вашего подпредставления с помощью метода void, называемого чем-то вроде specialButtonPressedOnView:(SUBVIEWCLASS *)view
. Затем в контроллере представления подпредставления вы должны сделать себя делегатом для этого протокола и ответить на метод делегата из контекста VC.
Использование self.superview - плохая идея, потому что вы не можете гарантировать, каким будет ваш superview, и, как правило, слепой вызов метода для объектов (ОСОБЕННО тех, которые приведены к id) - действительно плохая идея.
Другой ответ, в котором предлагалось, чтобы суперпредставление реализовало протокол подпредставления, также не является хорошим стилем, потому что вы создаете зависимость между своими представлениями. Если вы думаете пойти по этому пути, ваше подпредставление, вероятно, должно быть просто подклассом суперпредставления.
Одной из основных частей шаблона проектирования MVC является обеспечение возможности многократного использования ваших представлений и их полной независимости. Это всего лишь структуры, в которые вы можете внедрить свой контент, на что они будут реагировать красивым пользовательским интерфейсом, и им не нужно ничего знать о том, что им передается, и им не нужно обращаться за помощью к другим представлениям. Таким образом, либо использование делегирования через ViewController подвида, либо создание подклассов, вероятно, является лучшим направлением. Оба метода сохраняют шаблон MVC и намного безопаснее, чем другие предложения.