我有一个名为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
创建自定义委托对我来说是一个未知的领域。谁能告诉我我做错了什么?谢谢!
答案 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 TargetView
中MainViewController.h
的前向声明,简单的#import "TargetView.h"
就足够了。
之后,您还需要实现所需的- (void)receivedTargetTap;
,否则编译器会再次抱怨TargetViewDelegate
未完全实现。