Crash on Setting Delegate

前提是你 提交于 2020-01-05 05:47:07

问题


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];

回答1:


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



回答2:


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




回答3:


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).




回答4:


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.

.


回答5:


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

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



回答6:


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];
    }

}


来源:https://stackoverflow.com/questions/18587318/crash-on-setting-delegate

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!