免责声明:我是个新手。
我正在编写一个算术闪卡应用作为学习项目。我有一个UITabViewController,底部的选项卡可以在几个不同的视图之间切换。一切都正常工作,直到我尝试在设置视图控制器中设置NSUserDefault布尔值,并尝试在Flashcards视图控制器中读取这些值时出现问题。
设置视图有一个开关来启用/禁用每个运算符(加法、减法等),如果启用了该类型的运算,则闪卡视图应随机呈现一个闪卡。
我认为我的错误在于我不理解数据封装、对象等核心概念。我会非常感谢任何帮助。
以下是设置视图控制器的代码。我甚至不确定如何将代码放入这个论坛,所以这可能是一个可笑的时刻……让我们看看:
这里是“闪卡视图”页面...
我正在编写一个算术闪卡应用作为学习项目。我有一个UITabViewController,底部的选项卡可以在几个不同的视图之间切换。一切都正常工作,直到我尝试在设置视图控制器中设置NSUserDefault布尔值,并尝试在Flashcards视图控制器中读取这些值时出现问题。
设置视图有一个开关来启用/禁用每个运算符(加法、减法等),如果启用了该类型的运算,则闪卡视图应随机呈现一个闪卡。
我认为我的错误在于我不理解数据封装、对象等核心概念。我会非常感谢任何帮助。
以下是设置视图控制器的代码。我甚至不确定如何将代码放入这个论坛,所以这可能是一个可笑的时刻……让我们看看:
// settings_flashcards.h
#import <UIKit/UIKit.h>
@interface settings_flashcards : UIViewController {
UISwitch *additionSwitch;
UISwitch *subtractionSwitch;
UISwitch *multiplicationSwitch;
UISwitch *divisionSwitch;
}
@property (nonatomic,retain) IBOutlet UISwitch *additionSwitch;
@property (nonatomic,retain) IBOutlet UISwitch *subtractionSwitch;
@property (nonatomic,retain) IBOutlet UISwitch *multiplicationSwitch;
@property (nonatomic,retain) IBOutlet UISwitch *divisionSwitch;
@end
并且...
/ settings_flashcards.m
#import "settings_flashcards.h"
@implementation settings_flashcards
@synthesize additionSwitch;
@synthesize subtractionSwitch;
@synthesize multiplicationSwitch;
@synthesize divisionSwitch;
- (void)viewDidLoad {
[additionSwitch addTarget:self action:@selector(additionSwitchFlipped) forControlEvents:UIControlEventValueChanged];
[subtractionSwitch addTarget:self action:@selector(subtractionSwitchFlipped) forControlEvents:UIControlEventValueChanged];
[multiplicationSwitch addTarget:self action:@selector(multiplicationSwitchFlipped) forControlEvents:UIControlEventValueChanged];
[divisionSwitch addTarget:self action:@selector(divisionSwitchFlipped) forControlEvents:UIControlEventValueChanged];
[super viewDidLoad];
}
-(void) additionSwitchFlipped {
if (additionSwitch.on) {
[[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:@"additionKey"];
}else {
[[NSUserDefaults standardUserDefaults] setBool:FALSE forKey:@"additionKey"];
}
}
-(void) subtractionSwitchFlipped {
if (subtractionSwitch.on) {
[[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:@"subtractionKey"];
}else {
[[NSUserDefaults standardUserDefaults] setBool:FALSE forKey:@"subtractionKey"];
}
}
-(void) multiplicationSwitchFlipped {
if (multiplicationSwitch.on) {
[[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:@"multiplicationKey"];
}else {
[[NSUserDefaults standardUserDefaults] setBool:FALSE forKey:@"multiplicationKey"];
}
}
-(void) divisionSwitchFlipped {
if (divisionSwitch.on) {
[[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:@"divisionKey"];
}else {
[[NSUserDefaults standardUserDefaults] setBool:FALSE forKey:@"divisionKey"];
}
}
这里是“闪卡视图”页面...
// flashcardsViewController.h
#import <UIKit/UIKit.h>
@interface flashcardsViewController : UIViewController <UIActionSheetDelegate>{
UILabel *firstNumberLabel;
UILabel *secondNumberLabel;
UILabel *answerNumberLabel;
UILabel *operatorLabel;
BOOL additionIsEnabled;
BOOL subtractionIsEnabled;
BOOL multiplicationIsEnabled;
BOOL divisionIsEnabled;
}
@property (nonatomic,retain) IBOutlet UILabel *firstNumberLabel;
@property (nonatomic,retain) IBOutlet UILabel *secondNumberLabel;
@property (nonatomic,retain) IBOutlet UILabel *answerNumberLabel;
@property (nonatomic,retain) IBOutlet UILabel *operatorLabel;
-(void) buttonClicked:(id)sender;
@end
并且...
// flashcardsViewController.m
#import "flashcardsViewController.h"
@implementation flashcardsViewController
@synthesize firstNumberLabel;
@synthesize secondNumberLabel;
@synthesize answerNumberLabel;
@synthesize operatorLabel;
- (void)viewDidLoad {
srand(time(0)); //seed random
//the following should assign the keys if they don't exist
if (![[NSUserDefaults standardUserDefaults] boolForKey:@"additionKey"]){
[[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:@"additionKey"];
}
if (![[NSUserDefaults standardUserDefaults] boolForKey:@"subtractionKey"]) {
[[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:@"subtractionKey"];
}
if (![[NSUserDefaults standardUserDefaults] boolForKey:@"multiplicationKey"]) {
[[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:@"multiplicationKey"];
}
if (![[NSUserDefaults standardUserDefaults] boolForKey:@"divisionKey"]) {
[[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:@"divisionKey"];
}
//the following should assign each BOOL variable based on the key
additionIsEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:@"additionKey"];
subtractionIsEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:@"subtractionKey"];
multiplicationIsEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:@"multiplicationKey"];
divisionIsEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:@"divisionKey"];
[super viewDidLoad];
}
-(void) buttonClicked:(id)sender{
int a = rand() % 4;// random number generator (number to enter loop)
if ( additionIsEnabled || subtractionIsEnabled || multiplicationIsEnabled || divisionIsEnabled) {
while (a < 5) {
switch (a) {
case 0:
if (additionIsEnabled == TRUE){
int x = rand() % 11 + 1;
int y = rand() %11 + 1;
firstNumberLabel.text = [[NSString alloc]initWithFormat: @"%i",x];
secondNumberLabel.text = [[NSString alloc]initWithFormat: @"%i",y];
answerNumberLabel.text = [[NSString alloc]initWithFormat: @"%i",(x+y)];
operatorLabel.text = [[NSString alloc]initWithFormat: @"+"];
a = 5;
}
else a++;
break;
case 1:
if (subtractionIsEnabled == TRUE){
int x = rand() % 19 + 1;
int y = rand() %11 + 1;
firstNumberLabel.text = [[NSString alloc]initWithFormat: @"%i",x];
secondNumberLabel.text = [[NSString alloc]initWithFormat: @"%i",y];
answerNumberLabel.text = [[NSString alloc]initWithFormat: @"%i",(x-y) ];
operatorLabel.text = [[NSString alloc]initWithFormat: @"-"];
a = 5;
}
else a++;
break;
case 2:
if (multiplicationIsEnabled == TRUE){
int x = rand() % 11 + 1;
int y = rand() %11 + 1;
firstNumberLabel.text = [[NSString alloc]initWithFormat: @"%i",x];
secondNumberLabel.text = [[NSString alloc]initWithFormat: @"%i",y];
answerNumberLabel.text = [[NSString alloc]initWithFormat: @"%i",(x*y)];
operatorLabel.text = [[NSString alloc]initWithFormat: @"×"];
a = 5;
}
else a++;
break;
case 3:
if (divisionIsEnabled == TRUE){
int x = rand() % 11 + 1;
int y = rand() % 11 + 1;
firstNumberLabel.text = [[NSString alloc]initWithFormat: @"%i",(x*y)];
secondNumberLabel.text = [[NSString alloc]initWithFormat: @"%i",y];
answerNumberLabel.text = [[NSString alloc]initWithFormat: @"%i",x];
operatorLabel.text = [[NSString alloc]initWithFormat: @"÷"];
a = 5;
}
else a = 0;
break;
default:
break;
}
}
}
else
{
UIAlertView *noOperatorSelectedAlert = [[UIAlertView alloc]initWithTitle:@"You have not set any operations."
message:@"Return to the settings menu and decide which operations you wish to perform. (addition, subtraction, etc.)"
delegate:self
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[noOperatorSelectedAlert show];
[noOperatorSelectedAlert release];
}
}
[[NSUserDefaults standardUserDefaults] synchronize]
吗?每次设置新值时都可以调用它。 - fabian789synchronize
是一个很糟糕的错误,应该很少使用。它所做的只是创建不必要的开销。 - sudo rm -rfobjectForKey:
,它将返回nil
(如果该键不存在)。此外,在Objective-C中,通常使用YES
和NO
而不是TRUE
和FALSE
(尽管后者也可以工作)。 - DarkDustsynchronize
。 - DarkDust