проблема в доступе к переменной из другого класса - PullRequest
0 голосов
/ 12 декабря 2011

Я написал следующий код для хранения переменных в классе для последующего доступа из другого класса:

SettingsController.h

@interface SettingsController : NSObject

@property (nonatomic) BOOL isHighway;
@property (nonatomic) BOOL isToll;
@property (nonatomic) BOOL isVoiceNavigation;
@property (nonatomic) BOOL isVoiceCommand;

-(id)initWithHighway:(BOOL)_isHighway;
-(id)initWithToll:(BOOL)_isToll;
-(id)initWithVoiceNavigation:(BOOL)_isVoiceNavigation;
-(id)initWithVoiceCommand:(BOOL)_isVoiceCommand;

-(BOOL)isHighwayOn;
-(BOOL)isTollOn;
-(BOOL)isVoiceNavigationOn;
-(BOOL)isVoiceCommandOn;

@end

SettingsController.m

@implementation SettingsController

@synthesize isHighway,isToll,isVoiceNavigation,isVoiceCommand;

-(id)initWithHighway:(BOOL)_isHighway{
    if ((self = [super init])) {
        self.isHighway = _isHighway;
    }
    return self;
}

-(id)initWithToll:(BOOL)_isToll{
    if ((self = [super init])) {
        self.isToll = _isToll;
    }
    return self;
}

-(id)initWithVoiceNavigation:(BOOL)_isVoiceNavigation{
    if ((self = [super init])) {
        self.isVoiceNavigation = _isVoiceNavigation;
    }
    return self;
}

-(id)initWithVoiceCommand:(BOOL)_isVoiceCommand{
    if ((self = [super init])) {
        self.isVoiceCommand = _isVoiceCommand;
    }
    return self;
}

-(BOOL)isHighwayOn{
    return self.isHighway;
}

-(BOOL)isTollOn{
    return self.isToll;
}

-(BOOL)isVoiceNavigationOn{
    return self.isVoiceNavigation;
}

-(BOOL)isVoiceCommandOn{
    return self.isVoiceCommand;
}

@end

Из моего класса SettingsViewController я инициализирую значения следующим образом:

SettingsController *settingsController = [[SettingsController alloc] initWithHighway:isHighways];

и обращаюсь к ним как

BOOL isHighway = [settingsController isHighwayOn];

Но если я пытаюсь получить доступ к этой переменной из другого класса,RouteViewController выглядит следующим образом:

SettingsController *settingsController = [[SettingsController alloc] init];

BOOL isHighway = [settingsController isHighwayOn];

Это всегда дает мне 0, а я никогда не получаю 1.

Может ли кто-нибудь помочь мне в доступе к этим переменным?

РЕДАКТИРОВАТЬ

ОК, я удалил SettingsController и перенес его интерфейс на RouteViewController.Я инициализирую с SettingsViewController следующим образом:

RouteViewController *routeController = [[RouteViewController alloc] initWithHighway:isHighways];

и затем обращаюсь к нему из RouteViewController просто:

NSLog(@"Highway: %d",self.isHighway);

Даже тогда это всегда дает мне 0 никогда 1.

РЕДАКТИРОВАТЬ

Для того, чтобы просто поддерживать эти 4 UISwich в моем SettingsViewController, я сейчас использую NSUserDefaults.Я думаю, что это лучший способ сделать это ... Спасибо за вашу помощь ...

Ответы [ 3 ]

1 голос
/ 12 декабря 2011

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

В любом случае, как сказал ThomasM, если вы установите значение YES, оно должно выйти как YES.

BOOL isHighways = YES;
SettingsController *settingsController = [[SettingsController alloc] initWithHighway:isHighways];
NSLog(@"Highways?  %@", settingsController.isHighwayOn ? @"YES" : @"NO");

Это должно вывести ДА.

Обратите внимание, что вы создаете свойства, но вы также создаете метод доступа. Это избыточно - settingsController.isHighway и settingsController.isHighwayOn будут возвращать одно и то же значение.

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

0 голосов
/ 12 декабря 2011

Как отметил ThomasM в комментариях, вы не инициализировали переменную isHighway. Поскольку вы не реализовали метод init для класса SettingsController, при вызове

SettingsController *settingsController = [[SettingsController alloc] init];

Вы вызываете инициализатор по умолчанию, который не инициализирует вашу переменную isHighway (или, лучше, isHighway инициализируется в 0).

Попробуйте заново реализовать метод init, например:

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

    if (self) {
        isHighWay = 1;
    }

    return self;
 }
0 голосов
/ 12 декабря 2011

Вы должны использовать одноэлементный объект для SettingsController или передать инициализированный каким-либо образом. Обратите внимание, что сначала вы создаете объект: SettingsController *settingsController = [[SettingsController alloc] initWithHighway:isHighways];, а затем вместо его повторного использования вы инициализируете новый объект в: SettingsController *settingsController = [[SettingsController alloc] init];. Таким образом, он не содержит ранее инициированных переменных.

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