Matias Frank Jensen
Matias Frank Jensen

Reputation: 517

Subview acessing superview methods

How can a subview access the methods from its superview? I have a button, and when pressed I would like the button to call a method from its superview, but I do not know how.

Upvotes: 0

Views: 1833

Answers (4)

Dipu Rajak
Dipu Rajak

Reputation: 693

suppose your super View class name is

MainView.h

sub View Name

SubView.h

So In sub class you can do

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

Make sure someMethod is public Method.

Other way you could have reference to all the view is set a tag For example

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

In the subview you could do

   MainView *myMainView = (Mainview *)[self viewWithTag:100];
   [myMainView someMethod];

Upvotes: 2

Tsvi Tannin
Tsvi Tannin

Reputation: 407

All of the answers listed are hacky and bad style. You should be using delegation through the subview's ViewController. What you will want to do is create a protocol for your subview with a void method called something like specialButtonPressedOnView:(SUBVIEWCLASS *)view. Then in the subview's view controller you should make yourself the delegate for this protocol and respond to the delegate method from the VC's context.

Using self.superview is a bad idea because you cannot guarantee what your superview is going to be and generally blindly calling method on objects (ESPECIALLY those cast to id) is a really bad idea.

The other answer that suggested having the superview implement the subview's protocol is also not good style because you're creating a dependency between your views. If you were thinking of going down this path your subview should probably just be a subclass of the superview.

One of the core parts of the MVC design pattern is making sure that your views are reusable and totally independent. They are just structures that you can inject your content into, to which they will respond with pretty UI, and they don't need to know anything about what's being passed to them and don't have to ask other views for help. So either using delegation through the subview's ViewController or subclassing is probably the best direction. Both methods preserve the MVC pattern and are much safer than the other suggestions.

Upvotes: 0

hackerinheels
hackerinheels

Reputation: 1141

One method is to use delegates.

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

In your Subview add this: @property (nonatomic, weak) id selectionDelegate;

When subview is created, set delegate to superview.

Define Superview as delegate in .h file

@interface SuperView : UIView <ButtonHandlingDelegate>

in Superview .m file

- (void) subviewButtonWasPressed{
     // Do somethign about it
}

Upvotes: 0

Daij-Djan
Daij-Djan

Reputation: 50129

a weird construct but just call the method:

inside a view you have have self.superview

since self.superview is a UIView*, the compiler will claim it is invalid to call method XYZ on it. Cast it to id or to your class name to use it

e.g.

[(id)self.superview myMethod];

or even

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


Upvotes: 1

Related Questions