客观C - 无法识别的代表
问题描述:
我是Objective C的新手,并试图理解代表的概念。我有下面的代码,并且已经在构建中发生警告和错误的地方发表了评论。我正在使用最新版本的Xcode并使用Storyboard。客观C - 无法识别的代表
从MainViewController.h
#import <UIKit/UIKit.h>
#import "FinalViewController.h"
@class MainViewController;
@protocol MainViewControllerDelegate <NSObject>
- (void)sayHello;
@end
@interface MainViewController : UIViewController
@property (nonatomic, strong) id <MainViewControllerDelegate> delegate;
- (void)writeToMe;
. . .
@end
从MainViewController.m
#import "MainViewController.h"
#import "FinalViewController.h"
@interface MainViewController()
@end
@implementation MainViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)writeToMe
{
[self.delegate sayHello];
}
. . .
@end
从FinalViewController.h
#import <UIKit/UIKit.h>
#import "MainViewController.h"
@interface FinalViewController : UIViewController <NSCoding, MainViewController> //The ERROR below appears
//ERROR:Cannot find protocol declaration for ‘MainViewControllerDelegate’; did you mean ‘UIPageViewControllerDelegate’?
. . .
@end
从FinalViewController.m
#import "FinalViewController.h"
@interface FinalViewController()
@end
@implementation FinalViewController
- (void)viewDidLoad
{
[super viewDidLoad];
MainViewController *mainVC;
mainVC.delegate = self; //causes WARNING below
//WARNING:Assigning to ‘id <MainViewControllerDelegate> from incompatible type ‘FinalViewController *const__strong’
[mainVC writeToMe];
. . .
}
- (void)sayHello
{
NSLog(@"sayHello called");
}
@end
我已经研究了这个网站上类似问题的问题和反应,但还没有找到使用Storyboard的解决方案。
答
变化:
#import "MainViewController.h"
#import "FinalViewController.h"
@interface MainViewController()
@end
@implementation MainViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)writeToMe
{
[self.delegate sayHello];
}
. . .
TO:
#import "MainViewController.h"
@interface MainViewController()
@end
@implementation MainViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)writeToMe
{
[self.delegate sayHello];
}
. . .
ALSO:
#import <UIKit/UIKit.h>
#import "FinalViewController.h"
@class MainViewController;
@protocol MainViewControllerDelegate <NSObject>
- (void)sayHello;
@end
@interface MainViewController : UIViewController
@property (nonatomic, strong) id <MainViewControllerDelegate> delegate;
- (void)writeToMe;
. . .
@end
TO
#import <UIKit/UIKit.h>
@protocol MainViewControllerDelegate <NSObject>
- (void)sayHello;
@end
@interface MainViewController : UIViewController
@property (nonatomic, weak) id <MainViewControllerDelegate> delegate;
- (void)writeToMe;
. . .
@end
---------------------------编辑--------------------- ---------------
变化
@interface FinalViewController : UIViewController <NSCoding, MainViewController>
到
@interface FinalViewController : UIViewController <NSCoding, MainViewControllerDelegate>
答
这可能是一个错字,但:
@interface FinalViewController : UIViewController <NSCoding, MainViewController>
应be:
@interface FinalViewController : UIViewController <NSCoding, MainViewControllerDelegate>
还从MainViewController.h
删除"FinalViewController.h"
的导入。
和你其他的警告可以通过改变固定:
@interface FinalViewController()
到:
@interface FinalViewController() < MFMailComposeViewControllerDelegate>
和变化:
mainVC.delegate = self;
到:
mainVC.mailComposeDelegate = self;
+0
maddy:删除FinalViewController.h导入导致构建成功,但协议方法未被调用。添加
CW0007007:我按照您的建议更改了代码,仍然收到相同的错误。 –
CW0007007:构建成功,但NSLog语句未出现在控制台中。 –
在这里看到我的答案如何正确设置代理人: http://stackoverflow.com/questions/21331523/how-to-declare-events-and-delegates-in-objective-c/21331771#21331771 – CW0007007