2012-02-03 3 views
0

У меня есть два viewControllers, обращаясь к NSNumber на AppDelegate. Один из них видит это, а другой не может. Я совершенно смущен этим.iOS Недвижимость не найдена на объекте типа 'AppDelegate *'

У этого проблемы есть этот код.

AppDelegate *dataStore = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
dataStore.downHUD = [NSNumber numberWithFloat:(float)progress]; 

У другого есть это.

AppDelegate *dataStore = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
dataStore.downHUD = [NSNumber numberWithFloat:(float)0]; 

Оба импорта AppDelegate в файле .m, но я в конечном итоге с

недвижимости 'downHUD' не найден на объект типа 'AppDelegate *'

с первым один. Любой, кто может помочь мне понять, что не так?

Я скопировал и вставил много кода в AppDelegate по ошибке, что было исправлено. Есть ли какая-то связь, которая может быть нарушена?

+0

импорт «AppDelegate.h»;) – Alkimake

+0

Убедитесь, что '@ end' находится в вашем файле AppDelegate.h без последующего« мусора »и что оператор до его завершения заканчивается символом'; ', в случае необходимости. –

+0

@Hot Licks Это все в порядке. Алкимаке импортируется повсюду. Все еще застряли. Не могу понять, почему он работает один день, а затем нет. – Jorgen

ответ

7

Возможно, такого имущества нет в вашем классе AppDelegate.

В вашем AppDelegate.h под декларацией интерфейса вы должны иметь

@property (nonatomic, retain) NSNumber* downHUD; 

В вашем AppDelegate.m при объявлении реализации необходимо иметь

@synthesize downHUD; 

таким образом вы определяете аксессор (геттер и setter) для доступа к переменной экземпляра с именем downHUD. Этот аксессуар является общедоступным и вы можете сделать

dataStore.downHUD = ... 

Возможно, это может быть ошибка. Но без кода AppDelegate сложно понять, что происходит.

Надеюсь, это поможет.

Edit:

Это не хорошая стратегия для доступа к данным в делегат приложения.Я предлагаю вам использовать одиночек как singletons-appdelegates-and-top-level.html

Edit 2:

@interface SingletonModel : NSObject { 
    NSNumber* downHUD_; 
} 

+ (id)sharedInstance; 

@property (nonatomic, retain) NSNumber* downHUD; 

@end 

#import "SingletonModel.h" 

@implementation SingletonModel 

@synthesize downHUD = downHUD_; 

static SingletonModel *sharedInstance = nil; 

+ (SingletonModel *)sharedInstance { 
    if (sharedInstance == nil) { 
     sharedInstance = [[super allocWithZone:NULL] init]; 
    } 

    return sharedInstance; 
} 

- (id)init 
{ 
    self = [super init]; 

    if (self) { 

    } 

    return self; 
} 

-(void)dealloc 
{ 
    [super dealloc]; 
} 

+ (id)allocWithZone:(NSZone*)zone { 
    return [[self sharedInstance] retain]; 
} 

- (id)copyWithZone:(NSZone *)zone { 
    return self; 
} 

- (id)retain { 
    return self; 
} 

- (NSUInteger)retainCount { 
    return NSUIntegerMax; 
} 

- (oneway void)release { 

} 

- (id)autorelease { 
    return self; 
} 

@end 

Чтобы установить модель:

SingletonModel* model = [SingletonModel sharedInstance]; 
model.downHUD = ... 

Для чтения модели:

SingletonModel* model = [SingletonModel sharedInstance]; 
NSNumber* n = model.downHUD; 

Для других info читать iphone-code-snippet-the-singleton-pattern и singleton-classes. О Singletons вы можете найти в документации на яблоко по адресу Cocoa Fundamentals Guide и по адресу Singleton.

+0

У меня есть '@property (copy, readwrite) NSNumber * downHUD;' в .h, и он синхронизирован в .m-файле. Странно, что один из файлов видит это, а не другой. – Jorgen

+0

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

+0

Отличный ответ и +1 для использования для этого синглтонов вместо наложения делегата приложения. –

0

Если вы импортировали файлы заголовков, тогда он должен работать. Вы пытались очистить и перестроить свой проект? Вы можете сделать это с помощью CMD + Shift + K (или выбрав Очистить от Проект).

+0

CMD-Shift-K этого не делал. – Jorgen

1

Ваши два контроллера могут ссылаться на разные коды AppDelegate. Несмотря на то, что в Xcode Project Navigator отображается только один набор файлов AppDelegate, а Jump to Definition показывает одно и то же определение класса AppDelegate в обоих случаях, один из контроллеров представления может иметь другой код делегата.

У меня была эта проблема с определением класса делегата, где некоторые переменные-члены были доступны только в одном контроллере представления, но не в другом.

Щелкните правой кнопкой мыши каждый файл ViewController.m в Навигаторе проектов и используйте Show in Finder, чтобы узнать, находятся ли они в том же месте, что и нужные файлы AppDelegate. Если нет, переместите файлы VC в нужное место и добавьте их в проект.

Смежные вопросы