Reputation: 1081
I have a custom view (settingview) with nib and protocol. i want to add this view on a viewcontoller with delegate. When i set its delegate my app crashes and i don't know what i have done wrong.
i don't have NIB for ViewController.
i am attaching few images of my code and View's NIB.
.h
@protocol SettingViewDelegate
@required
-(void)CornerSlider:(id)sender;
-(void)MarginSlider:(id)sender;
-(void)BorderSlider:(id)sender;
-(void)ShadowSlider:(id)sender;
-(void)BorderColor:(id)sender;
-(void)ShadowColor:(id)sender;
-(void)remove:(id)sender;
@end
@interface SettingView : UIView
@property (nonatomic, assign) id delegate;
-(IBAction)CornerSlider1:(id)sender;
-(IBAction)MarginSlider1:(id)sender;
-(IBAction)BorderSlider1:(id)sender;
-(IBAction)ShadowSlider1:(id)sender;
-(IBAction)BorderColor1:(id)sender;
-(IBAction)ShadowColor1:(id)sender;
-(IBAction)remove1:(id)sender;
@end
.m
@implementation SettingView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self = [[[NSBundle mainBundle] loadNibNamed: @"Setting"
owner: self
options: nil] objectAtIndex:0];
}
return self;
}
-(IBAction)CornerSlider1:(id)sender
{
[self.delegate CornerSlider:sender];
}
-(IBAction)MarginSlider1:(id)sender
{
[self.delegate MarginSlider:sender];
}
-(IBAction)BorderSlider1:(id)sender
{
[self.delegate BorderSlider:sender];
}
-(IBAction)ShadowSlider1:(id)sender
{
[self.delegate ShadowSlider:sender];
}
-(IBAction)BorderColor1:(id)sender{
[self.delegate BorderColor:sender];
}
-(IBAction)ShadowColor1:(id)sender{
[self.delegate ShadowColor:sender];
}
-(IBAction)remove1:(id)sender{
[self.delegate remove:sender];
}
@end
app crashes here after setting its delegate.
SettingView *settingView=[[SettingView alloc]init];
[settingView setDelegate:self];
[self.view addSubview:settingView];
Upvotes: 1
Views: 1093
Reputation: 636
Try this -
.h
@protocol SettingViewDelegate
-(void)CornerSlider:(id)sender;
-(void)MarginSlider:(id)sender;
-(void)BorderSlider:(id)sender;
-(void)ShadowSlider:(id)sender;
-(void)BorderColor:(id)sender;
-(void)ShadowColor:(id)sender;
-(void)remove:(id)sender;
@end
@interface SettingView : UIView
@property (nonatomic, assign) id delegate;
-(IBAction)CornerSlider1:(id)sender;
-(IBAction)MarginSlider1:(id)sender;
-(IBAction)BorderSlider1:(id)sender;
-(IBAction)ShadowSlider1:(id)sender;
-(IBAction)BorderColor1:(id)sender;
-(IBAction)ShadowColor1:(id)sender;
-(IBAction)remove1:(id)sender;
@end
.m
-(IBAction)CornerSlider1:(id)sender
{
if([self.delegate respondsToSelector:@(CornerSlider:)])
{
[self.delegate CornerSlider:sender];
}
}
-(IBAction)MarginSlider1:(id)sender
{
if([self.delegate respondsToSelector:@(MarginSlider:)])
{
[self.delegate MarginSlider:sender];
}
}
-(IBAction)BorderSlider1:(id)sender
{
if([self.delegate respondsToSelector:@(BorderSlider:)])
{
[self.delegate BorderSlider:sender];
}
}
-(IBAction)ShadowSlider1:(id)sender
{
if([self.delegate respondsToSelector:@(ShadowSlider:)])
{
[self.delegate ShadowSlider:sender];
}
}
-(IBAction)BorderColor1:(id)sender{
if([self.delegate respondsToSelector:@(BorderColor:)])
{
[self.delegate BorderColor:sender];
}
}
-(IBAction)ShadowColor1:(id)sender{
if([self.delegate respondsToSelector:@(ShadowColor:)])
{
[self.delegate ShadowColor:sender];
}
}
-(IBAction)remove1:(id)sender{
if([self.delegate respondsToSelector:@(remove:)])
{
[self.delegate remove:sender];
}
}
Upvotes: 0
Reputation: 533
Replace @required with @optional
@protocol SettingViewDelegate
@optional
-(void)CornerSlider:(id)sender;
-(void)MarginSlider:(id)sender;
-(void)BorderSlider:(id)sender;
-(void)ShadowSlider:(id)sender;
-(void)BorderColor:(id)sender;
-(void)ShadowColor:(id)sender;
-(void)remove:(id)sender;
@end
Upvotes: 3
Reputation: 664
Use the following setter method for delegate in the SettingsView implementation.
-(void)setDelegate:(id)adelegate
{
_delegate = adelegate;
}
Upvotes: 0
Reputation: 1081
Mistake found. It was in IB. I was setting Custom Class (SettingView) to File's Owner's Class. Now Its View's Custom Class and File's Owner is UIView's Class.
and now its working fine. .
Upvotes: 0
Reputation: 1148
Did you try
@interface BlaBlaViewController : UIViewController<SettingsViewDelegate>
I saw in your code:
-(void)setDelegate:(id)delegate
{
self.delegate = delegate;
}
This would result in an endless loop. You should use the synthesized _ivar for overloading the setter (or leave it out all together).
Upvotes: 0
Reputation: 41
See whether you have implemented all the methods of your delegate into your "self.view" class where you add your "Setting View". Also, see whether you had implemented "SettingsViewDelegate" into the class you add "Setting View" as subview.
For more clarification, look this https://stackoverflow.com/a/12660523/859001
Upvotes: 0