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];

SpinnerView Category

Leave a Reply