Subview достъп до методите за superview

Как може подизглед да има достъп до методите от своя суперизглед? Имам бутон и когато го натисна, бих искал бутонът да извика метод от неговия суперизглед, но не знам как.


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


Отговори (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];
person Dipu Rajak    schedule 16.07.2014

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

вътре в изглед имате self.superview

тъй като self.superview е UIView*, компилаторът ще твърди, че е невалидно да се извиква метод XYZ върху него. Прехвърлете го към id или към името на вашия клас, за да го използвате

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

Във вашия подизглед добавете това: @property (неатомен, слаб) id selectionDelegate;

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

Дефинирайте Superview като делегат в .h файл

@interface SuperView : UIView <ButtonHandlingDelegate>

в Superview .m файл

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

Всички изброени отговори са хакерски и в лош стил. Трябва да използвате делегиране чрез ViewController на subview. Това, което ще искате да направите, е да създадете протокол за вашия подизглед с метод void, наречен нещо като specialButtonPressedOnView:(SUBVIEWCLASS *)view. След това в контролера на изгледа на subview трябва да направите себе си делегат за този протокол и да отговорите на метода на делегат от контекста на VC.

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

Другият отговор, който предлага superview да внедри протокола на subview, също не е добър стил, защото създавате зависимост между вашите изгледи. Ако сте мислили да тръгнете по този път, вашият подизглед вероятно трябва да бъде просто подклас на суперизгледа.

Една от основните части на шаблона за проектиране на MVC е да гарантирате, че вашите изгледи са многократно използвани и напълно независими. Те са просто структури, в които можете да инжектирате съдържанието си, на което те ще отговорят с красив потребителски интерфейс и не е нужно да знаят нищо за това, което им се предава, и не е нужно да молят други изгледи за помощ. Така че или използването на делегиране чрез ViewController на subview или подкласирането е може би най-добрата посока. И двата метода запазват модела MVC и са много по-безопасни от другите предложения.

person Tsvi Tannin    schedule 16.07.2014
comment
Съгласен съм най-вече, което исках да изразя с „странна конструкция“. -- НО също така отдавна не виждам MVC като такъв черно-бял свят -- ИМА ситуации, в които искате да се противопоставите на правилата. напр. когато създавате изглед, който всъщност е 1 контейнерен изглед и N подизгледи и където не искате да излагате подизгледите. - person Daij-Djan; 17.07.2014