Objective-C не может найти объявление интерфейса - PullRequest
0 голосов
/ 29 сентября 2011

Я некоторое время царапал голову, пытаясь понять это.

У меня есть следующие файлы .h

//ClassA.h
#import "ClassB.h"

@interface ClassA {
}

@property SomeEnum blah;

@end

//ClassB.h
#import "ClassA.h"

typedef enum SomeEnum
{
     value1,
     value2
}SomeEnum;

@interface ClassB {
}

@property SomeEnum otherblah;

@end

@interface ClassA (Category) {
}

@end

Я думаю, что проблема в том, что ClassA нужен SomeEnum изClassB и поэтому ему нужно импортировать его, а ClassB нужен ClassA для своей категории, поэтому он должен импортировать его.Есть ли проблема с их импортом друг в друга?Нужно ли включать третий класс?

Вот ошибки компилятора, которые я получаю:

In ClassB.h: Cannot find interface declaration for 'ClassA'
In ClassA.h: Unknown type name 'SomeEnum'

РЕДАКТИРОВАТЬ: Я заставил его работать, переместивобъявление категории в ClassA и затем наличие @class ClassA в ClassB.h ... но я все еще не уверен, почему это не сработало бы в первую очередь

Ответы [ 3 ]

2 голосов
/ 29 сентября 2011

Вы хотите разорвать свои зависимости.Поместите определение enum SomeEnum в один файл заголовка, затем включите импорт для этого заголовка в ClassA.h и ClassB.hClassA.h удалите импорт ClassB.h.

2 голосов
/ 29 сентября 2011

Есть ли у вас (объявление не по категориям):

@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"
0 голосов
/ 08 января 2017
#import <UIKit/UIKit.h>

Вы должны импортировать <UIKit/UIKit.h>, в любом объекте содержится «объявление интерфейса»

например: UIImage NSDate и т.д ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...