如何从Iphone中的另一个uiview调用协议



我的问题与此类似,以前问问题,请为我提供一些解决方案??

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{}//在您的控制器文件

最新更新