Blind Ninja
Blind Ninja

Reputation: 1081

Crash on Setting Delegate

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.

-[UIView setDelegate:]: unrecognized selector sent to instance 0xb265e20

.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

Views Nib

app crashes here after setting its delegate.

SettingView *settingView=[[SettingView alloc]init];
[settingView setDelegate:self];
[self.view addSubview:settingView];

Upvotes: 1

Views: 1093

Answers (6)

Pooja Patel
Pooja Patel

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

Nevil Lad
Nevil Lad

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

Inoka
Inoka

Reputation: 664

Use the following setter method for delegate in the SettingsView implementation.

-(void)setDelegate:(id)adelegate 
{
    _delegate = adelegate;
}

Upvotes: 0

Blind Ninja
Blind Ninja

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.

enter image description here

and now its working fine. .

Upvotes: 0

Rob van der Veer
Rob van der Veer

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

M.Sworna Vidhya
M.Sworna Vidhya

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

Related Questions