2012-03-19 81 views
1

这应该是一个简单的问题 - 但我很难搞清楚。我试图在一个对象上创建一个属性,这样在prepareForSegue期间,我可以告诉对象它的委托是什么。我知道我可以通过协议来做到这一点,但我认为这种情况下直接的做法是最简单的。不幸的是,下面的代码会导致一个编译器错误:声明委托属性时出错

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

@interface DepartmentViewController : UITableViewController 

@property (nonatomic, weak) PlanningViewController *planningDelegate; 

@end 

当我键入财产申报时,Xcode识别PlanningViewController甚至显示文本,我只是通过TAB。但编译器却抱怨道:

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 
+1

请显示'PlanningViewController.h'的内容。 – trojanfoe 2012-03-19 13:39:42

回答

1

删除此行从您的PlanningViewController.h头文件:

#import "DepartmentViewController.h" 

你有一个循环在你的头文件的东西。

更妙的是,使DepartmentViewController.h这个样子的(没有必要包括在PlanningViewController.h头文件):

#import <UIKit/UIKit.h> 

@class PlanningViewController; 

@interface DepartmentViewController : UITableViewController 

@property (nonatomic, weak) PlanningViewController *planningDelegate; 

@end 
+0

做过这份工作。谢谢! – CodeBuddy 2012-03-19 13:53:49

+0

@CodeBuddy就是这样 - 欢呼! – trojanfoe 2012-03-25 14:34:54

0

我想你已经有种错过了代表图案的要点之一这是解耦你的对象。声明此委托的最好的办法是:

#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 
} 

这里的例子只是一个可以发送给委托的消息的例子。你可以添加你需要的任何东西,但是这样做会使你的控制器之间没有耦合。计划视图控制器知道需要的关于部门控制器的所有内容,但部门控制器不需要知道计划控制器的任何信息。

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

+0

有道理。我坚持使用它,但是,正如你所建议的那样,为了避免混淆,请重新命名。 – CodeBuddy 2012-03-25 14:11:27