在UIView / UIViewController关系中定义委托

时间:2014-03-05 15:46:39

标签: ios objective-c delegates

我有一个名为TargetView的子类UIView,它包含在一个名为MainViewController的UIViewController中。我想将MainViewController设置为TargetView的委托,以便MainViewController可以从子视图(TargetView)接收消息。

在我的MainViewController(UIViewController)标题中,我有以下内容:

#import <UIKit/UIKit.h>
#import "TargetView.h"

@class TargetView;

@interface MainViewController : UIViewController <TargetViewDelegate>

@property (strong, nonatomic) IBOutlet TargetView *target;    
@property (strong, nonatomic) IBOutlet UILabel *lblResults;

@end

当我在接口声明中设置TargetViewDelegate时,它显示在代码完成中,因此它知道它在那里,但是然后构建失败并显示消息:找不到协议声明......“

在我的TargetView(UIView)类中,我有以下内容:

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import "MainViewController.h"

@protocol TargetViewDelegate

@required
-(void)receivedTargetTap;

@end

@interface TargetView : UIView{

    id<TargetViewDelegate> delegate;
}

@property (nonatomic,strong) NSString *lblResults;
@property (nonatomic,weak) id<TargetViewDelegate> delegate;

@end

创建自定义委托对我来说是一个未知的领域。谁能告诉我我做错了什么?谢谢!

2 个答案:

答案 0 :(得分:2)

我相信你的TargetView.h应该是:

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>

@protocol TargetViewDelegate <NSObject>

@required
-(void)receivedTargetTap;

@end

@interface TargetView : UIView

@property (nonatomic, strong) NSString *lblResults;
@property (nonatomic, weak) id<TargetViewDelegate> delegate;

@end

MainViewController.h:

#import <UIKit/UIKit.h>
#import "TargetView.h"

@interface MainViewController : UIViewController <TargetViewDelegate>

@property (strong, nonatomic) IBOutlet TargetView *target;    
@property (strong, nonatomic) IBOutlet UILabel *lblResults;

@end

从您的代码中,您必须在协议定义后添加<NSObject>,并删除TargetView类中的MainViewController.h导入。

答案 1 :(得分:1)

我认为import个文件中的.h语句可能存在问题。

为什么从MainViewController.h引用TargetView.h?好像你不需要它。另一方面,您应该删除@class TargetViewMainViewController.h的前向声明,简单的#import "TargetView.h"就足够了。

之后,您还需要实现所需的- (void)receivedTargetTap;,否则编译器会再次抱怨TargetViewDelegate未完全实现。