Ошибка при объявлении свойства делегата - PullRequest
1 голос
/ 19 марта 2012

Это должен быть простой вопрос - но мне сложно разобраться.Я пытаюсь создать свойство для объекта, чтобы во время 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 ]

2 голосов
/ 19 марта 2012

Удалите эту строку из заголовочного файла 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 голос
/ 19 марта 2012

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

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

Пример, приведенный здесь, является просто примером одного сообщения, которое вы можете отправить делегату. Вы можете добавить все, что вам нужно, но это делает так, чтобы между контроллерами не было связи. Контроллер вида планирования знает все, что ему нужно о контролере отдела, но контролеру отдела не нужно ничего знать о контролере планирования.

Если вы хотите придерживаться того, что у вас есть в данный момент, просто признайте, что это на самом деле не шаблон делегата, и вам, вероятно, следует переименовать ваше свойство.

...