views:

86

answers:

2

Hi everyone, iPhone SDK question for you.

I've created a UIViewController category to shift a view up when UITextFields are being edited and the keyboard appears, blocking the fields. I found the code online and no doubt you iPhone gurus are familiar with it. The interface looks like this:

@interface UIViewController (Shiftable) 

      - (IBAction) textFieldDidBeginEditing:(UITextField *)textField;

      - (IBAction) textFieldDidEndEditing:(UITextField *)textField;

      - (void) animateTextField: (UITextField *)textField up:(BOOL)up;

@end

My problem is this-- every one of my UIViewControllers is affected by this category! I thought this would only affect UIViewControllers that import the category as follows:

 #import "UIViewController Shiftable.h"

But even UIViewControllers that do not import this category have their views shifted up when UITextFields are edited, and of course some of my views do not need to be shifted when the keyboard appears as the keyboard does not hide the fields.

Is my understanding of categories incorrect? Can anyone shed any light on this?

Thanks.

+2  A: 

No, that's the way categories work - if you add some methods to a class then all those changes will be available for all instances of that class during runtime.

Vladimir
A: 

The important point is that in the file where you #import "UIViewController Shiftable.h", all instances of UIViewController will have the new methods. If you don't import your category file, none of your UIViewControllers will.

If you need some view controllers to have these new/modified methods but other view controllers not, consider subclassing UIViewController.

Yang
All UIViewController instances will respond to the methods added in custom category regardless wether you imported header with category definition or not. Importing header will only affect compiler warnings about those methods.
Vladimir