iPhone: calling a parent/super method from a subview
hope someone can help me on this as been stuck for hours.
I am trying to make a kind of picture book. I have a view which is my container and I add subviews to that by using addsubview.
On the subview, I have swipe gestures etc that I want to trigger off method in the parent view. I worked out how t开发者_JAVA技巧o trigger the delegate but I cant get the delegate to trigger the parent view. I have read over 10 different ways of doing it and none work.
I now very confused about what a super view is to. Just to confuse matters, the delegate has a tabcontroller and the parent view is tab button 1
I tried
[self.view.superview method]
[self.superview method]
On the delegate I tried self.tabcontroller.parentviewcontroller, selectedview, super view.super
UPDATE : The subview needs to be independant of the parent view as its a reusable view. Also I have not set the parentview to superview as I just thought a superview is a view with subviews (please don't kill me). So maybe I just need to set the parentview to a superview?
The proper way of doing such things is to use protocol and delegate pattern.
Define a protocol like
@protocol subViewDelegate
-(void)somethingHappened:(id)sender;
@end
then implement that protocol in your superview :
@interface superView:UIViewController<subViewDelegate> {
...
}
...
@end
define a delegate property in your SubView like this
@interface subView : UIView {
id<subViewDelegate> delegate;
...
}
@propery (nonatomic, assign) id<subViewDelegate> delegate;
...
@end
the in your subview, call the delegate like this
[self.delegate somethingHappened :self];
It's a little hard to help you without any code given, but let's try:
- Create a protocol: Name it however you like (I will call it "MyProtocol") and add to it the definition of the function you want to call in your superview, let's call it "respondToSwipe"
- If your superview is a UIView, you have to create your own subclass of UIView and make your superview an instance of that class.
- Let your (newly) created superview class implement the protocol of 1.) an implement the "respondToSwipe" method
- Create an instance variable of the the type id in your subview, and name it however you like, e.g. "myDelegate".
- Pass the superview created in 2/3.) to your "myDelegate" variable
- Call [myDelegate respondToSwipe] whenever you like
For a custom view, you could subclass UIControl and use control events:
- Define some control events. You're free to make up 4 control events (
UIControlEventApplicationReserved = 0x0F000000
) - Have whoever wants to receive events call addTarget:action:forControlEvents:
- Have the control call
[self sendActionsForControlEvents:events]
Alternatively, you could use a UIGestureRecognizer-style interface (addTarget:action:).
Alternatively just use UIGestureRecognizer (OS 3.2+)
Did your parent view set itself to be the superview of the subview when it added the subview? Otherwise the subview doesn't know who its superview is.
The more standard way of naming things to call the method handler the delegate instead of the superview, make it a property, and have the subview check for both the existence of the delegate being set and whether it can handle the method.
Here a very good example of how apply the delegation pattern on the iPhone. I downloaded the code an it works pretty good.
http://www.hivestudio.cat/index.php?option=com_content&view=article&id=57:technical-note-the-delegation-pattern-on-the-iphone&catid=35:technical-note-category&Itemid=76
精彩评论