Подтвердить что ты не робот

"Нет видимого @interface для" BlahDataController "объявляет селектор" aMethod: ""

Простой пример моей проблемы:

"Внутри BlahDataController.h"

@interface BlahDataController : NSObject
-(NSString *)aMethod:(NSString *)theString;
@end

"Внутри BlahDataController.m"

#import "BlahDataController.h"
@implementation BlahDataController

-(NSString *)aMethod:(NSString *)theString
{
    return @"Something";
}

@end

"Внутри BobViewController.h"

@interface BobViewController : NSObject
-(void)aMethodOfSomeSort;
@end

"Внутри BobViewController.m"

#import "BobViewController.h"
#import "BlahDataController.h"

@implementation BobViewController

-(void)aMethodOfSomeSort
{
    BlahDataController *blahDataController = [[BlahDataController alloc] init];
    NSLog(@"%@",[blahDataController aMethod:@"Variable"]);
}

@end

В строке "NSLog (@" % @ ", [blahDataController aMethod: @" Variable "]); Я получаю сообщение об ошибке:" Нет видимого @interface для "BlahDataController" объявляет селектор "aMethod:"

Кто-нибудь знает, почему эта ошибка возникает?

- = - = - = - = - = - = - = - = - = - = -

Дело в том, что в моей реальной программе у меня есть эта же реализация, и она отлично работает для сотен методов, созданных таким образом. Однако каждый раз так часто я получаю эту ошибку по вновь созданному методу. Я не поступил иначе. Он просто не узнает это вновь созданное существование.

- = - = - = - = - = - = - = - = - = - = -

Вот как я сейчас обхожу это, хотя я понятия не имею, почему компилятор принимает этот способ, но не другой:

Измените BobViewController.m:

#import "BobViewController.h"
#import "BlahDataController.h"
#import "AnotherDataController.h"

@implementation BobViewController

-(void)aMethodOfSomeSort
{
    BlahDataController *blahDataController = [[BlahDataController alloc] init];
    AnotherDataController *anotherDataController = [[AnotherDataController alloc] init];
    [anotherDataController fixedMethod:blahDataController theString:@"Variable"];
}

@end

"Внутри AnotherDataController.h"

@interface AnotherDataController : NSObject
-(void)fixedMethod:(BlahDataController *)blahDataController theString:(NSString *)theString;
@end

"Внутри AnotherDataController.m"

#import "AnotherDataController.h"
#import "BlahDataController.h"
@implementation AnotherDataController

-(void)fixedMethod:(BlahDataController *)blahDataController theString:(NSString *)theString
{
    NSLog(@"%@",[blahDataController aMethod:theString]);
}
@end

И... он работает просто отлично... Поэтому я считаю, что xcode просто не распознает метод в одном классе и работает так, как должен, в другом... Человек, я понятия не имею, почему эта ошибка происходит...

- = - = -

Незначительное обновление:
Выполнение всего "xcode dance" не решило проблему
1) Чистое строительство
2) Удалить производные данные
3) Полностью закрыть XCode и снова открыть

4b9b3361

Ответ 1

Хорошо, для всех в будущем с этой проблемой; это проблема.

Я сделал BlahDataController несколько месяцев назад. Примерно неделю назад я перестроил папки проекта и переместил BlahDataController из папки под названием "Бла" в другую папку под названием "Данные" .

Когда я изменил код для BlahDataController в папке "Данные" , один из моих классов мог видеть измененный код, однако другой класс не смог.

В результате проблема заключалась в том, что когда я переместил BlahDataController, она фактически создала ее копию. Таким образом, у меня был BlahDataController в папке "Данные" и более старый BlahDataController в папке "Blah". Хотя старый BlahDataController больше не привязан к проекту в менеджере проектов (слева от xcode), тот факт, что физический файл все еще существовал в папке, вызвал эту проблему.

После удаления дублированной более старой копии BlahDataController проблема была решена.

tl; dr - Там где-то в проекте дублируется файл! Иди охотиться и уничтожить его безжалостно!

Ответ 2

Если кто-то сталкивается с подобной проблемой, в моем случае я сделал несколько рефакторингов с использованием функции "Найти и заменить" (игнорируя случай), и я получил что-то вроде этого:

SomeClass* SomeClass = [[SomeClass alloc] init];
[SomeClass instanceMethod];

и он говорил: "Нет видимого @interface для" SomeClass "объявляет метод" alloc ". Поэтому в моем случае проблема заключалась в том, что я переименовал переменную экземпляра в верхний регистр. Решение было:

SomeClass* SomeClass = [[SomeClass alloc] init];
[SomeClass instanceMethod];

PS: Я рекомендую использовать функцию "Refactor" в Xcode вместо "Найти и заменить", если это возможно.

Ответ 3

Примечание: не ответ на этот точный вопрос, но я нашел здесь ту же ошибку компилятора.

Убедитесь, что вы знаете, вызываете ли вы метод экземпляра или статический метод:

@interface SomeClass

+(void) SomeMethod;

против.

-(void) SomeMethod;

Это разные.

[SomeClass SomeMethod];

против.

[[[SomeClass alloc] init] SomeMethod];

Ответ 4

Также обратите внимание, что это может произойти (например, с шаблоном проекта мастера/детали), если

"Other Linker Flags"
Значение

установлено на

-ObjC

как того требуют некоторые структуры, например. RestKit (проблема на странице RestKits github: https://github.com/RestKit/RestKit/issues/1153)

Ответ 5

Да, у меня была такая же проблема. У меня была эта идеальная работа в моей Платной цели, хотя, когда я перешел на мою свободную цель, я получил эту ошибку.

Нет видимого @interface для 'GameOverScene' объявляет селектор mesageToDisplayOnLabel:

  • чтобы исправить это, написание моего вызова метода было отличным от метода, который я вызывал.

    - (void) messageToDisplayOnLabel//Мне не хватает s в "сообщении" в вызове метода Doh!
     {
     // код метода
     }

  • Проверьте правильность написания метода, который вы вызываете.