Keeping it DRY with Objective-C Categories
The iPad app I’m working on has several screens where I need to make asynchronous HTTP requests. For a nice user experience, I need to show some sort of “please wait” message so the user knows something is going on.
To do this, I built a simple UIViewController with a xib that has a transparent black background, rounded corners, a UIActivityIndicatorView, and a UILabel for the message.
Since I have several screens where I’ll need to use this, I created a simple Objective-C Category to mix in my new view to any UIViewController.
Header:
#import <Foundation/Foundation.h>
@class SpinnerViewController;
@interface UIViewController (SpinnerView)
-(void) showSpinnerView:(NSString *)text;
-(void) showSpinnerView;
-(void) hideSpinnerView;
@end
Implementation:
#import "UIViewController+SpinnerView.h"
#import "SpinnerViewController.h"
@implementation UIViewController (SpinnerView)
-(void) showSpinnerView:(NSString *)text {
SpinnerViewController *vc = [[SpinnerViewController alloc] initWithNibName:@”SpinnerViewController” bundle:nil];
vc.view.center = self.view.center;
vc.label.text = text;
[self.view addSubview:vc.view];
[vc release];
}
-(void) showSpinnerView {
[self showSpinnerView:@"Saving..."];
}
-(void) hideSpinnerView {
NSArray *subviews = self.view.subviews;
[[subviews lastObject] removeFromSuperview];
}
@end
Then, in any view controller, adding spinners is as easy as this:
#import "UIViewController+SpinnerView.h"
...
[self showSpinnerView];
[self hideSpinnerView];
