Does categories allow to use dot syntax when accessing chained methods?
I need to attach a method to all my UIViewControllers. The method just returns a pointer to my main app delegate class object. However, xcode 4 throws an error "parse issue expected a type" in header file at the declaration of output parameter type MyAppDelegate. If I change it to the other type, for example id, then th开发者_StackOverflow社区e error goes away. But I'm using a dot syntax to access main app delegate properties and if I will change the type to id then xcode4 not recognize my main app delegate properties. I have included the definition file of category to those UIViewController class files where I'm accessing this method. Here is definition of my category:
#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
Here is an implementation:
#import "MyCategory.h"
@implementation UIViewController (MyCategory)
-(MyAppDelegate *)appDelegate{
MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
return delegate;
}
EDIT: The reason why I'm implementing this category is that I need to have handy shortcut for accessing my main app delegate from any place of the code (in my case from UIViewControler objects):
// handy shortcut :)
self.appDelegate.someMethod;
//not so handy shortcut :(
MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
I think you have a dependency cycle in your header files. If MyAppDelegate.h
imports MyCategory.h
either directly or indirectly, the first time the category declaration is compiled the compiler won't know what a MyAppDelegate
is. You should remove the import of MyAppDelegate.h
from the MyCategory.h
header and replace it with a forward class declaration:
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@class MyAppDelegate
@interface UIViewController (MyCategory)
-(MyAppDelegate *) appDelegate;
@end
Then put the import in the .m
file instead. This is actually a good general principle. Where possible, use forward class declarations in the headers and put imports in the implementation file.
-(id)appDelegate{
return [[UIApplication sharedApplication] delegate];
}
//Calling code
MyAppDelegate* delegate = (MyAppDelegate*)[self appDelegate];
Add @class MyAppDelegate;
to the top of your category header to let the compiler know that this class exists or #import
its header.
Generally, it might be a better idea to have a class method in MyAppDelegate
that does the same thing. Conceptually, appDelegate
is not a property of an individual view controller which your method implies.
精彩评论