2011-12-12 71 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。我認爲這是一個更好的方式...謝謝你的幫助... –