2011-12-12 49 views
-1

我写了下面的代码保存在另一类别后访问类变量:问题从另一个类访问变量

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

任何人都可以请帮助我访问这些变量?

编辑

OK,我已经去除了SettingsController,并采取其接口为RouteViewController。我是从SettingsViewController初始化如下:

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

然后通过简单地从RouteViewController访问它:

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

即使如此,它总是给我0从未1

编辑

对于刚刚维持这4 UISwich在我SettingsViewController现在,我使用NSUserDefaults的。我认为这是一个更好的方法...感谢所有的帮助...

+1

你在哪里设置的布尔值将价值?它们都从0开始,所以如果你没有设置它们的值,当然,你会得到0而不是1. – ThomasM

+0

我正在使用UISwitch切换布尔值 –

+0

你的编辑不清楚。请更好地解释您对代码所做的更改,否则很难理解您放置代码的位置以及代码无法工作的原因。 – Saphrosit

回答

0

你应该使用单例对象的SettingsController,或通过初始化的某种方式。请注意,首先创建对象:SettingsController *settingsController = [[SettingsController alloc] initWithHighway:isHighways];,然后重新初始化新对象:SettingsController *settingsController = [[SettingsController alloc] init];,而不是重新使用它。所以它不包含先前启动的变量。

1

在我看来,你想让这个类存储4个变量,但是你有4个初始化程序,这是一种不寻常的方式。我不知道应用程序的其余部分,但是想创建此类只存储一个变量是很常见的吗?

无论如何,正如ThomasM所说,如果您将该值设置为YES,那么它应该返回为YES。

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

这应该打印YES。

请注意,您正在创建属性,但您也正在创建一个存取方法。这是多余的 - settingsController.isHighway和settingsController.isHighwayOn会返回相同的值。

(并且阅读关于使其成为单例的其他答案 - 除非您将这些属性保留在某处,否则该类的每个实例都将拥有自己的一组值。

+0

它以这种方式打印YES。好的,我删除了SettingsController并将其接口传递给RouteViewController。我从SettingsViewController初始化如下: RouteViewController * routeController = [[RouteViewController alloc] initWithHighway:isHighways]; 然后从RouteViewController通过以下方式访问它: NSLog(@“Highway:%d”,self.isHighway); 即使它总是给我0从来没有1. –

0

正如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

让我解释一下,以便更好地理解: 我有一个SettingsViewController,它包含4个UISwitch。我正在使用它们在SettingsController类中存储[UISwitch isOn]值。然后我试图访问RouteViewController类中的BOOL值。当我访问RouteViewController中的SettingsController的BOOL值时,虽然值从SettingsViewController存储为1,但我总是得到0。 –

+0

你说得对。顺便说一下,为了在SettingsViewController中维护这4个UISwich,我现在使用了NSUserDefaults。我认为这是一个更好的方式...谢谢你的帮助... –