【问题标题】:How to call the protocol from another uiview in Iphone?如何从 Iphone 中的另一个 uiview 调用协议?
【发布时间】:2014-03-29 07:04:18
【问题描述】:

My Question is similar to this Previously ask question please provide me some solution for this ??

在我的 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];
}

//在我的 GridView.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 值??

编辑代码以获取更多信息

//在我的视图控制器中

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

提前致谢

【问题讨论】:

  • 您的代码是正确的.. 但我怀疑awakeFromNib 是否被调用?
  • @Volker 不一样的 View 是 GrideView
  • @iphonic 是的,awakeFromNib 总是打电话..
  • @Vishu 是否也显示了您在 wakeFromNib 中创建的设置视图?还是您错误地显示了设置视图的另一个实例?
  • @Volker 我只是在 GrideView awakeFromNib 方法中调用 settingView 的委托。。 SettingView 已经由 myviewController 类创建。

标签: ios objective-c uiview


【解决方案1】:

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 部分使用它创建属性:

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

【讨论】:

    【解决方案2】:

    如果设置视图已经在您的 nib 中,并且网格视图已经在您的 nib 中,则将委托属性声明更改为 IBOutlet:

    @property (assign) IBOutlet id<settingViewProtocol> delegate;
    

    并在界面生成器中建立委托连接。删除您的 awakeFromNib 方法。

    您当前的代码正在创建设置视图的新实例并设置该视图的委托,但这不是屏幕上的视图。

    【讨论】:

    • 不起作用我使用它,当我在它上面应用断点时给出 struct_objeC_object * delegate 0x0 并且在打印它时它给出委托的打印描述:(null)
    • 什么不起作用?它是否让您在界面生成器中建立连接?
    • 那么你将不得不用更多细节来编辑你的问题。您如何首先加载所有这些?你还在用代码初始化这些视图吗?
    【解决方案3】:

    它返回 nil,因为您没有将任何确认 settingViewProtocol 的对象分配给委托属性。

    您可以在 xib 文件中进行设置,也可以通过以下方式手动设置: self.settingView.delegate = self; 并确保您使用的 VC 确认 settingViewProtocol

    还有一件事是关于 awakeFromNib。 也许当您将 self 分配给委托时,您的 gridView 没有被实例化。它只是简单地从 xib 文件中唤醒。所以,检查一下self是否初始化。

    【讨论】:

      【解决方案4】:

      在setting.h文件中

      @protocol settingViewProtocol <NSObject>
      

      -(void)getSelectedLanguageID:(NSInteger)langID; @结束

      @interface SettingView : UIView {

      NSMutableArray *settingElementArray; NSMutableArray *settingImageArray; UIPickerView *LanguagePickerView; NSArray *pickerArray; UI工具栏*工具栏; 身份代表; }

      @property (nonatomic,stronh)id 委托;

      // 在我的 SettingView.m 中

      -(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{

      if([self.delegate respondsToSelector:@selector(getSelectedLanguageID:)]) //检查是委托 [self.delegate getSelectedLanguageID:row];

      }

      现在在你的控制器中

      -(void)awakeFromNib { [超级清醒的笔尖]; 如果(!设置视图) settingView = [[SettingView alloc]init]; settingView.delegate = self; [self.view addsubview:settingView]; }

      //然后就可以访问了 -(void)getSelectedLanguageID:(NSInteger)langID{} //在你的控制器文件中

      【讨论】:

        猜你喜欢
        • 2012-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-21
        • 2018-11-30
        • 2013-07-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多