我的问题与此类似,以前问问题,请为我提供一些解决方案??
In my SettingView.h
@protocol settingViewProtocol <NSObject>
-(void)getSelectedLanguageID:(NSInteger)langID;
@end
@interface SettingView : UIView<UITableViewDataSource,UITableViewDelegate,UIPickerViewDelegate,UIPickerViewDataSource>
{
NSMutableArray *settingElementArray;
NSMutableArray *settingImageArray;
UIPickerView *LanguagePickerView;
NSArray *pickerArray;
UIToolbar *toolBar;
}
@property (assign)id<settingViewProtocol> delegate;
// in my SettingView.m
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
[self.delegate getSelectedLanguageID:row];
}
//In my GrideView.h
#import "SettingView.h"
@interface GrideView : UIView <AVAudioPlayerDelegate,settingViewProtocol>{
MoreOptionView *moreOption;
AVAudioPlayer *audioPlayer;
BOOL isPlaying;
SettingView *settingView;
}
-(void)awakeFromNib
{
[super awakeFromNib];
settingView = [[SettingView alloc]init];
settingView.delegate = self;
}
但是委托返回nil值??
编辑代码获取更多信息
//在我的ViewController
self.settingView = (SettingView *)[[[NSBundle mainBundle]loadNibNamed:NSStringFromClass([SettingView class]) owner:self options:nil]objectAtIndex:0];
[self.settingView setFrame:CGRectMake(320*0, 0,bottomScrollView.frame.size.width, bottomScrollView.frame.size.height)];
self.settingView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"settingbackground.png"]];
[self.bottomScrollView addSubview:self.settingView];
Thanks in advance
delegate
属性为nil的原因是您实例化了两个不同的对象。
你在这里创建了一个对象:
@interface GrideView : UIView <AVAudioPlayerDelegate,settingViewProtocol>
-(void)awakeFromNib
{
[super awakeFromNib];
settingView = [[SettingView alloc]init];
settingView.delegate = self;
}
创建并设置delegate
。该对象在delegate
属性中具有价值。
您还可以在这里创建另一个 SettingView
实例:
self.settingView = (SettingView *)[[[NSBundle mainBundle]loadNibNamed:NSStringFromClass([SettingView class]) owner:self options:nil]objectAtIndex:0];
[self.settingView setFrame:CGRectMake(320*0, 0,bottomScrollView.frame.size.width, bottomScrollView.frame.size.height)];
self.settingView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"settingbackground.png"]];
[self.bottomScrollView addSubview:self.settingView];
SettingView
的实例不在delegate
属性中有值
如何解决?您需要在视图控制器上使用SettingView
的所有实例。例如,如果你在视图控制器中设置了GrideView
属性:
@interface ViewController
...
@property (nonatomic, weak) IBOutlet GrideView *gridView;
...
@end
你可以在GrideView
的-awakeFromNib
中创建SettingView
,并为视图控制器暴露属性:
@implementation GrideView
...
- (void)awakeFromNib
{
[super awakeFromNib];
self.settingView = (SettingView *)[[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([SettingView class]) owner:self options:nil] objectAtIndex:0];
self.settingView.delegate = self;
}
...
@end
在interface
section中创建属性:
@interface GridView : UIView
...
@property (nonatomic, strong) SettingView *settingView; // strong - because you want to keep it till view controller use it
...
@end
你在gridView
的视图控制器属性:
[self.gridView.settingView setFrame:CGRectMake(320*0, 0,bottomScrollView.frame.size.width, bottomScrollView.frame.size.height)];
self.gridView.settingView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"settingbackground.png"]];
[self.bottomScrollView addSubview:self.gridView.settingView];
如果设置视图已经在你的nib中,并且网格视图已经在你的nib中,那么将委托属性声明更改为IBOutlet:
@property (assign) IBOutlet id<settingViewProtocol> delegate;
并在接口构建器中创建委托连接。移除你的awakeFromNib方法。
你当前的代码正在创建一个新的实例的设置视图和设置视图的委托,但这不是在屏幕上的视图。
它返回nil,因为你没有给委托属性分配任何确认settingViewProtocol的对象
你可以在xib文件中设置它,也可以手动设置它:self. setingview .delegate = self;确保你使用的VC确认settingViewProtocol
关于awakeFromNib还有一件事。也许当你把self赋值给委托时,gridView没有实例化。它只是从xib文件中被唤醒。检查self是否初始化了
在setting.h文件
@protocol settingViewProtocol <NSObject>
- - - - - - (void) getSelectedLanguageID: (NSInteger) langID;@end
@interface SettingView: UIView{
NSMutableArray * settingElementArray;NSMutableArray * settingImageArray;UIPickerView * LanguagePickerView;NSArray * pickerArray;UIToolbar *工具栏;id委托;}
@property (nonatomic, strong)id delegate;//在my setingview .m
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
if([self.delegate respondsToSelector:@selector(getSelectedLanguageID:)])//检查是否委托[self.delegate getSelectedLanguageID:行);
}
现在在你的控制器
awakeFromNib- (void){(超级awakeFromNib);如果(! settingView)setingview = [[setingview alloc]init];setingview .delegate = self;(自我。视图addsubview settingView):;}
//则可以访问-(void)getSelectedLanguageID:(NSInteger)langID{}//在您的控制器文件