【问题标题】:trouble with declaring a delegate声明委托的麻烦
【发布时间】:2012-03-02 16:28:31
【问题描述】:

我有两个视图,view1 调用 view2。我需要将数据从 view2 传递回 view1。所以我正在尝试设置一个代表。这是我在视图控制器 2 中得到的:

.h file

@protocol addEventDelegate <NSObject>

-(void) setAddedEventFlag:(BOOL) hasAddedEvent;

@end

@interface AddEventViewController : UIViewController <UITextFieldDelegate, UITextViewDelegate, UIPickerViewDelegate, UIPickerViewDelegate>

@property (weak, nonatomic) id delegate;  //changed from strong to weak

然后我在 .m 文件中 @synthesize 委托

当尝试为第一个视图控制器包含 addEventDelegate 时,xcode 找不到它:

.h file

#import "AddEventViewController.h"

@interface FieldReportViewController : UIViewController <UITextFieldDelegate, 
UITextViewDelegate, UIPickerViewDelegate, UIPickerViewDelegate, addEventDelegate>

我收到错误:“找不到 'addEventDelegate' 的协议声明”。

怎么了?

编辑:

//代码

错误:

【问题讨论】:

  • 你的错误信息是addEventDelegat——你确定你的代码拼写正确吗?
  • 其他一些注意事项: 1) 不应保留代表;您应该使用weak 或assign 作为属性; 2) 如果您希望代表遵守协议,也应该在那里声明id&lt;addEventDelegate&gt; delegate; 3) 我很确定你不想在协议定义中使用&lt;NSObject&gt;——你确定你需要那个吗?
  • 是的,我很抱歉,我只是打错字了。它是'addEventDelegate'
  • 这可能是一个导入循环吗?

标签: objective-c ios delegates


【解决方案1】:
  1. 确保拼写正确。
  2. 确保将 AddEventViewController.h/.m 添加到项目中。

除此之外,你所拥有的一切都很好。

编辑

我建议的其他方法是重命名您的代表,也许存在命名冲突。虽然我没有看到“添加”和“设置”有任何问题,但我过去在使用“新”前缀时看到过问题。

另外,清理您的项目并重新构建,看看是否有帮助。

如果您的项目中有多个目标,并且可能只将 AddEventViewController.h/m 添加到其中一个,并且您正在构建/调试不同的目标,则可能会出现这种情况。

【讨论】:

  • 拼写正确(将委托添加到 FieldReportViewController 时,它会自动完成)。包含 AddEvetnViewController.h/.m 文件,应用程序编译并运行良好,没有此错误。
  • 很遗憾,没有。我在发布之前检查了这些东西。这是第一次尝试使用委托。
  • 如果在 #include "AddEventViewController.h" 下的 FieldReportViewController.m 文件顶部添加前向声明:@protocol addEventDelegate; 会发生什么?
  • 好吧,我的#import "AddEventViewController.h" 在我的 FieldEventViewController.h 中;我尝试在 .h 和 .m 文件中添加 @protocol addEventDelegate,没有用。
  • 听起来像是环境问题。你使用 xCode 吗?
【解决方案2】:

这是定义协议的正确方法

@protocol addEventDelegate; // forward declaration for delegate property

@interface AddEventViewController : UIViewController <UITextFieldDelegate, UITextViewDelegate, UIPickerViewDelegate, UIPickerViewDelegate>
{
    id <addEventDelegate> *delegate
}

@property (weak, nonatomic) id <addEventDelegate> *delegate; 

@end // interface

@protocol addEventDelegate <NSObject>
// @optional // if you want to make it optional
    -(void) setAddedEventFlag:(BOOL) hasAddedEvent;
@end // protocol

【讨论】:

  • 像这样设置它仍然会发生错误。在原始帖子中添加了屏幕截图。
  • #import "AddEventViewController.h" 中的文件名是否正确?还是应该是 #import "addEventViewController.h" ?
  • 它是#import "AddEventViewController.h"。如果我取出委托代码,我的项目编译并运行良好。
【解决方案3】:

解决了这个问题。我有一个#import 循环。我在我的 .h 文件中 #importing 我的所有类。我在 .h 文件中更改为 @Class 并将#import 移到 .m 文件中,现在就像一个魅力。

【讨论】:

    【解决方案4】:

    您可以在FieldReportViewController.m文件中导入addEventDelegate

    @interface FieldReportViewController ()<AddEventDelegate>
    @end
    

    这个在我的应用程序中工作

    【讨论】:

      猜你喜欢
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      相关资源
      最近更新 更多