声明委托属性时出错

时间:2012-03-19 13:34:06

标签: objective-c delegates properties

这应该是一个简单的问题 - 但我很难搞清楚。我正在尝试在对象上创建一个属性,以便在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

2 个答案:

答案 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
}

此处的示例只是您可以发送给代理的一条消息的示例。您可以添加所需的任何内容,但这使得控制器之间没有耦合。规划视图控制器知道部门控制器所需的一切,但部门控制器不需要了解规划控制器的任何信息。

如果你想坚持你现有的东西,只要认识到它不是委托模式,你应该重命名你的财产。