这应该是一个简单的问题 - 但我很难搞清楚。我正在尝试在对象上创建一个属性,以便在prepareForSegue期间我可以告诉对象它的委托是什么。我知道我可以通过协议来做到这一点,但我认为对于这种情况,直接的方法是最简单的。不幸的是,以下代码导致编译器错误:
#import <UIKit/UIKit.h>
#import "PlanningViewController.h"
@interface DepartmentViewController : UITableViewController
@property (nonatomic, weak) PlanningViewController *planningDelegate;
@end
当我输入属性声明时,Xcode会识别PlanningViewController,甚至可以显示我的文本。但是,编译器抱怨道:
Unknown type name 'PlanningViewController': did you mean 'UISplitViewController'?
我做错了什么?
PlanningViewController.h如下所示:
#import <UIKit/UIKit.h>
#import "DepartmentViewController.h"
@interface PlanningViewController : UITableViewController
// Table cell connections
- (IBAction)addItemPressed:(id)sender;
@end
答案 0 :(得分:2)
从PlanningViewController.h
标题文件中删除此行:
#import "DepartmentViewController.h"
你的头文件中有一些循环。
更好的是,让DepartmentViewController.h
看起来像这样(不需要在头文件中包含PlanningViewController.h
):
#import <UIKit/UIKit.h>
@class PlanningViewController;
@interface DepartmentViewController : UITableViewController
@property (nonatomic, weak) PlanningViewController *planningDelegate;
@end
答案 1 :(得分:1)
我认为你错过了委托模式的一个要点,即将你的对象解耦。声明此委托的最佳方式是:
#import <UIKit/UIKit.h>
@protocol DepartmentViewControllerDelegate; // forward declaration of protocol
@interface DepartmentViewController : UITableViewController
@property (nonatomic, weak) id <DepartmentViewControllerDelegate> delegate;
@end
@protocol DepartmentViewControllerDelegate
- (void)departmentViewController:(DepartmentViewController *)controller
isProcessingPeople:(NSArray *)people
@end
在您的部门视图控制器中,您将编写如下内容:
if ([self.delegate respondsToSelector:@selector(departmentViewController:isProcessingPeople:)]) {
[self.delegate departmentViewController:self isProcessingPeople:people];
}
在您的计划视图控制器中,您将实现此方法:
- (void)departmentViewController:(DepartmentViewController *)controller
isProcessingPeople:(NSArray *)people {
// do necessary work here
}
此处的示例只是您可以发送给代理的一条消息的示例。您可以添加所需的任何内容,但这使得控制器之间没有耦合。规划视图控制器知道部门控制器所需的一切,但部门控制器不需要了解规划控制器的任何信息。
如果你想坚持你现有的东西,只要认识到它不是委托模式,你应该重命名你的财产。