2012-03-19 2 views
1

Это должен быть простой вопрос, но мне трудно понять его. Я пытаюсь создать свойство на объекте, так что во время подготовкиForSegue я могу сообщить объекту, что это за делегат. Я знаю, что могу сделать это с помощью протоколов, но я решил, что для этого случая прямой подход будет самым простым. К сожалению, следующий код приводит к ошибке компилятора:Ошибка при объявлении свойства делегирования

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

Просьба отобразить содержимое 'PlanningViewController.h'. – trojanfoe

ответ

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

+0

@CodeBuddy Вот и все - привет! – trojanfoe

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