views:

106

answers:

1

Hi all,

I have a parentview with a ui view on it. This loads a subviewcontroller on viewdidload. The subviewcontroller has a button on it that is linked up on touch up inside to a subviewcontroller method called clicked.

This causes a bad access error to fire and crashes the app. My question is, is this setup possible or do I have to have the method in the parent view? The subview will be loaded in 8 different parentviews so I would like to keep the method in the subview.

What would be the correct way of doing this?

+1  A: 

The good approach for this kind of setup is to have a protocol including the click message, a delegate property of type id in the view containing the button and a method in the same view that fires the delegated message like so [self.delegate clicked]. The TouchUpInside event is linked to that method in IB and the parent view set itself as delegate of the subview and conform itself to the protocol. It can sounds a bit tricky but its definitely the proper way to do.

the Protocol

@protocol viewWithButtonDelegate
  -(void)buttonClicked:(UIButton*)button inView:(UIView*)view;
@end

in the subview interface

@interface viewWithButton {
...
id<viewWithButtonDelegate> delegate;
}
...
@property (nonatomic, retain) id<viewWithButtonDelegate> delegate
-(void)buttonClicked:(id)sender;
...
@end

in the subview implementation

-(void)buttonClicked:(id)sender {
  if([sender class] == [UIButton class]) {
    [self.delegate buttonClicked:(UIButton*)sender inView:self]
  }
}

the controller interface is declared like this

@interface myController<viewWithButtonDelegate>

and finally in the controller implementation :

-(void)buttonClicked:(UIButton*)button inView:(UIView*)view {
  //do something in response to button clicked
}

hope this helps...

VdesmedT