Позволяют ли категории использовать точечный синтаксис при доступе к цепочечным методам? - PullRequest
1 голос
/ 08 августа 2011

Мне нужно прикрепить метод ко всем моим UIViewControllers.Метод просто возвращает указатель на мой основной объект класса делегата приложения.Однако xcode 4 выдает ошибку «проблема синтаксического анализа, ожидаемая типом» в заголовочном файле при объявлении типа выходного параметра MyAppDelegate.Если я изменю его на другой тип, например, id, то ошибка исчезнет.Но я использую точечный синтаксис для доступа к основным свойствам делегата приложения, и если я изменю тип на id, то xcode4 не распознает мои основные свойства делегата приложения.Я включил файл определения категории в те файлы классов UIViewController, где я получаю доступ к этому методу.Вот определение моей категории:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "MyAppDelegate.h"

@interface UIViewController (MyCategory)

-(MyAppDelegate *) appDelegate; // xcode 4 complains about MyAppDelegate type, though it autocompletes it and show even in green color.

@end

Вот реализация:

#import "MyCategory.h"

@implementation UIViewController (MyCategory) 

-(MyAppDelegate *)appDelegate{
  MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
  return delegate;
}

РЕДАКТИРОВАТЬ: причина, по которой я реализую эту категорию, заключается в том, что мне нужно иметь удобный ярлык длядоступ к моему основному делегату приложения из любого места кода (в моем случае из объектов UIViewControler):

// handy shortcut :)
self.appDelegate.someMethod;

//not so handy shortcut :(
MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 

Ответы [ 3 ]

1 голос
/ 08 августа 2011

Я думаю, у вас есть цикл зависимости в ваших заголовочных файлах. Если MyAppDelegate.h импортирует MyCategory.h прямо или косвенно, при первой компиляции объявления категории компилятор не будет знать, что такое MyAppDelegate. Вы должны удалить импорт MyAppDelegate.h из заголовка MyCategory.h и заменить его на объявление класса forward:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@class MyAppDelegate

@interface UIViewController (MyCategory)

-(MyAppDelegate *) appDelegate; 

@end

Затем поместите импорт в файл .m. На самом деле это хороший общий принцип. Где возможно, используйте предварительные объявления классов в заголовках и помещайте импорт в файл реализации.

1 голос
/ 08 августа 2011
-(id)appDelegate{
  return [[UIApplication sharedApplication] delegate]; 
} 

//Calling code
MyAppDelegate* delegate = (MyAppDelegate*)[self appDelegate];
0 голосов
/ 08 августа 2011

Добавьте @class MyAppDelegate; в начало заголовка вашей категории, чтобы сообщить компилятору о существовании этого класса или #import его заголовок.

Как правило, может быть лучше иметь метод класса в MyAppDelegate, который делает то же самое. Концептуально, appDelegate не является свойством отдельного контроллера представления, который подразумевает ваш метод.

...