2013-09-03 11 views
1

У меня есть пользовательский вид (настройка) с помощью nib и протокола. Я хочу добавить это представление в viewcontoller с делегатом. Когда я устанавливаю свой делегат, мое приложение падает, и я не знаю, что я сделал неправильно.Ошибка при настройке делегата

У меня нет NIB для ViewController.

У меня есть несколько изображений моего кода и 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

приложение падает здесь после установки его делегата.

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

записи й находится в SettingsView "@property (неатомный, назначать) id delegate;" он будет работать –

+0

У вас назначен делегат в SettingView? – NightFury

+3

Пожалуйста, не используйте скриншоты кода. Это делает редактирование невозможным. –

ответ

0

Ошибка найдена. Это было в IB. Я установил Custom Class (SettingView) в класс владельца файла. Теперь пользовательский класс View и владелец файла - это класс UIView.

enter image description here

и теперь его работает нормально. .

0

Посмотрите, внедрили ли вы все методы своего делегата в свой класс «self.view», где вы добавляете свой «Setting View». Кроме того, посмотрите, был ли вы реализован «SettingsViewDelegate» в класс, который вы добавляете «Настройка представления» в качестве подсмотра.

Для получения более разъяснений, посмотрите этот https://stackoverflow.com/a/12660523/859001

+0

Да, я следил за всеми этими вещами. –

0

Пробовали ли вы

@interface BlaBlaViewController : UIViewController<SettingsViewDelegate> 

Я видел в вашем коде:

-(void)setDelegate:(id)delegate 
{ 
    self.delegate = delegate; 
} 

Это приведет к бесконечной петле. Вы должны использовать синтезированный _ivar для перегрузки setter (или оставить его вместе).

+0

Да, я добавил setviewdelegate. –

+0

Это не проблема, я пробовал без этих строк. –

0

Используйте следующий метод setter для делегата в реализации SettingsView.

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

Replace @required с @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 
+0

Я хочу, чтобы они были необходимы. –

+0

@ HarvantS. Затем вам необходимо определить этот метод в файле .m и объявить в .h файле – Learner

+0

да, они определены в файле .m. и я не думаю, что методы протокола должны объявляться в файле .h. они? b'cos они уже объявлены в моем протоколе. –

0

Попробуйте это -

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

} 
+0

Проблема была в файле .XIB. См. Мой ответ ниже. –