Есть ли у вас (объявление не по категориям):
@interface ClassB
@end
, объявленное где угодно, обычно в ClassB.h
?
Или предварительное объявление:
@class ClassB
in ClassA.h
?
Попробуйте это для своего ClassA.h
:
//ClassA.h
@class ClassB
@interface ClassB (Category)
+ (id)classMethod
@end
Затем введите #import "ClassB.h"
в ClassA.m
.
Вы должныпоместите это в ClassA.h
:
@interface ClassA (Category) {
}
@end
А затем:
@implementation ClassA (Category)
в ClassA.m
над категорией @implementation ClassA
.
Лично я создаю отдельные файлы для категорий.Например, это в UIView-Extended.h:
@interface UIView (UIView_Extended)
enum {
UIViewAutoresizingHorizontal = (UIViewAutoresizingFlexibleLeftMargin |
UIViewAutoresizingFlexibleWidth |
UIViewAutoresizingFlexibleRightMargin),
UIViewAutoresizingVertical = (UIViewAutoresizingFlexibleTopMargin |
UIViewAutoresizingFlexibleHeight |
UIViewAutoresizingFlexibleBottomMargin),
UIViewAutoresizingAll = (UIViewAutoresizingFlexibleLeftMargin |
UIViewAutoresizingFlexibleWidth |
UIViewAutoresizingFlexibleRightMargin |
UIViewAutoresizingFlexibleTopMargin |
UIViewAutoresizingFlexibleHeight |
UIViewAutoresizingFlexibleBottomMargin)
};
typedef NSUInteger UIViewAutoresizing;
- (UIView *)findFirstResponder;
- (UIView *)setFirstResponder:(NSUInteger)viewTag;
- (IBAction)dismissKeyboard:(id)sender;
- (IBAction)nextPrevious:(id)sender;
@end
А затем в UIView-Extended.m
:
#import "UIView-Extended.h"
@implementation UIView (UIView_Extended)
- (UIView *)findFirstResponder {
if ([self isFirstResponder]) {
return self;
}
for (UIView *subview in [self subviews]) {
UIView *firstResponder = [subview findFirstResponder];
if (firstResponder) {
return firstResponder;
}
}
return nil;
}
- (UIView *)setFirstResponder:(NSUInteger)viewTag {
if (self.tag == viewTag) {
[self becomeFirstResponder];
return self;
}
for (UIView *subview in self.subviews) {
UIView *v = [subview setFirstResponder:viewTag];
if (v) {
return v;
}
}
return nil;
}
- (IBAction)dismissKeyboard:(id)sender {
[[self findFirstResponder] resignFirstResponder];
}
- (IBAction)nextPrevious:(id)sender {
UIView *responder = [self findFirstResponder];
if (!responder) return;
NSInteger newTag;
NSInteger tagMod = 1;
if (sender) {
tagMod = (((UISegmentedControl *)sender).selectedSegmentIndex ? 1 : -1);
}
UIView *v = [self viewWithTag:responder.tag + tagMod];
if ([v isKindOfClass:[UITextField class]] || [v isKindOfClass:[UITextView class]]) {
newTag = responder.tag + tagMod;
[self setFirstResponder:newTag];
} else {
// do something else... but what??
}
}
@end
Затем в моем файле префиксов (Project-Prefix.pch
):
#import "UIView-Extended.h"