Доступ к переменной-члену AppDelegate - PullRequest
1 голос
/ 26 января 2012

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

@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"

В .m у меня это где-то:

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

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 26 января 2012

Попробуйте:

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

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

1 голос
/ 26 января 2012

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

@synthesize screenwidth

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

0 голосов
/ 13 декабря 2013

Если вы хотите избегать приведения к вашему классу 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 и т. Д.

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