2012-01-26 5 views
1

Я пытаюсь обернуть голову вокруг одиночных чисел, и я понимаю, что делегат приложения - это, по сути, одноэлементный объект. Я пытаюсь иметь некоторые переменные-члены в App Delegate, к которым я могу получить доступ из любого другого класса. Я сделал это в App Делегат:Доступ к переменной-члену AppDelegate

@interface AppDelegate : NSObject <UIApplicationDelegate> { 
    UIWindow   *window; 
    RootViewController *viewController; 
    int screenwidth; 
} 

@property (nonatomic, retain) UIWindow *window; 
@property (nonatomic) int screenwidth; 

Тогда в .m я сделал это:

- (void) applicationDidFinishLaunching:(UIApplication*)application 
{ 
    ... 
    screenwidth=400; //arbitrary test number 

Теперь у меня есть еще один класс в проекте, и он делает это в .h:

#import "AppDelegate.h" 

В ом у меня есть это где-то:

test=(AppDelegate*)[[[UIApplication sharedApplication] delegate] screenwidth]; 

Однако он утверждает, что «screenwidth» - это метод экземпляра, который не найден. Я также попытался это:

test=(AppDelegate*)[[UIApplication sharedApplication] delegate].screenwidth; 

Это используется точечный синтаксис, так как screenwidth синтезировали, но он утверждает, что property screenwidth not found

Я уверен, что эти основные вопросы, которые могут быть исправлены просто. Любая помощь оценивается.

ответ

3

Рассмотрим попробовать:

test=[(AppDelegate*)[[UIApplication sharedApplication] delegate] screenwidth]; 

Я думаю, что ваши две попытки пытаются бросить .screenwidth результат к AppDelegate*.

+0

спасибо Тим! оцените указатель. (не каламбур!) – johnbakers

+2

Вы полностью намеревались каламбур. Не лгите. – Tim

+0

Это правда, что приведение было неправильным, но это не является причиной указанной ошибки. (Или, если это так, компилятору нужен хороший удар в голову.) – Caleb

1

Убедитесь, что вы либо Обеспечивая собственный -screenwidth аксессор или используя @synthesize директиву, чтобы получить компилятор, чтобы обеспечить один:

@synthesize screenwidth 

директива @property просто обещание, что аксессоры для screenwidth в собственности будет предоставляться. Вы все равно должны предоставить их, как описано выше.

+0

да, я синтезирован; Я не смог показать этот код. – johnbakers

0

Если вы хотите, чтобы избежать отливку к классу AppDelegate каждый раз, я рекомендую следующее:

В MyAppDelegate.h:

@interface MyAppDelegate : NSObject <UIApplicationDelegate> 

+ (MyAppDelegate *)sharedAppDelegate; 

@property (nonatomic) int screenwidth; 

/* ... */ 

@end 

В MyAppDelegate.m:

@implementation LcAppDelegate 

+ (MyAppDelegate *)sharedAppDelegate 
{ 
    return (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
} 

/* ... */ 

@end 

Конечно, вы все еще необходимо указать #import "MyAppDelegate.h" в файлах, где хотите к нему обратиться:

#import "MyAppDelegate.h" 

/* ... */ 

NSLog(@"the apps screen width: %d", [MyAppDelegate sharedAppDelegate].screenwidth); 

Кстати, не следует использовать int и тому подобное в коде Objective-C. Вместо этого используйте NSInteger, NSUInteger, CGFloat и так далее.

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