Как може подизглед да има достъп до методите от своя суперизглед? Имам бутон и когато го натисна, бих искал бутонът да извика метод от неговия суперизглед, но не знам как.
Subview достъп до методите за superview
Отговори (4)
да предположим, че името на класа ви супер изглед е
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 върху него. Прехвърлете го към id или към името на вашия клас, за да го използвате
e.g.
[(id)self.superview myMethod];
или дори
id myValue = [(id)self.superview myMethod:param1];
Един от методите е използването на делегати.
@protocol ButtonHandlingDelegate <NSObject>
- (void) subviewButtonWasPressed;
@end
Във вашия подизглед добавете това: @property (неатомен, слаб) id selectionDelegate;
Когато се създаде подизглед, задайте делегат на суперизглед.
Дефинирайте Superview като делегат в .h файл
@interface SuperView : UIView <ButtonHandlingDelegate>
в Superview .m файл
- (void) subviewButtonWasPressed{
// Do somethign about it
}
Всички изброени отговори са хакерски и в лош стил. Трябва да използвате делегиране чрез ViewController на subview. Това, което ще искате да направите, е да създадете протокол за вашия подизглед с метод void, наречен нещо като specialButtonPressedOnView:(SUBVIEWCLASS *)view
. След това в контролера на изгледа на subview трябва да направите себе си делегат за този протокол и да отговорите на метода на делегат от контекста на VC.
Използването на self.superview е лоша идея, защото не можете да гарантирате какво ще бъде вашето superview и като цяло сляпото извикване на метод на обекти (ОСОБЕНО тези, прехвърлени към id) е наистина лоша идея.
Другият отговор, който предлага superview да внедри протокола на subview, също не е добър стил, защото създавате зависимост между вашите изгледи. Ако сте мислили да тръгнете по този път, вашият подизглед вероятно трябва да бъде просто подклас на суперизгледа.
Една от основните части на шаблона за проектиране на MVC е да гарантирате, че вашите изгледи са многократно използвани и напълно независими. Те са просто структури, в които можете да инжектирате съдържанието си, на което те ще отговорят с красив потребителски интерфейс и не е нужно да знаят нищо за това, което им се предава, и не е нужно да молят други изгледи за помощ. Така че или използването на делегиране чрез ViewController на subview или подкласирането е може би най-добрата посока. И двата метода запазват модела MVC и са много по-безопасни от другите предложения.