Iphone Can';t在视图之间读取NSUserDefaults数据

Iphone Can';t在视图之间读取NSUserDefaults数据,iphone,objective-c,cocoa-touch,Iphone,Objective C,Cocoa Touch,免责声明:noob少校 作为一个学习项目,我正在编写一个算术闪存卡应用程序。我有一个带有底部选项卡栏的UITabViewController,可以在几个不同的视图之间切换。在我尝试在设置视图控制器中设置NSUserDefault布尔值并尝试在Flashcards视图控制器中读取这些值之前,一切正常 设置视图有一个开关,用于启用/禁用每个操作员(加法、减法等),如果启用了该类型的操作,则flashcard视图应随机显示一个闪存卡 我认为我的错误是我不理解数据封装、对象等的关键概念。如果有任何帮助,

免责声明:noob少校

作为一个学习项目,我正在编写一个算术闪存卡应用程序。我有一个带有底部选项卡栏的UITabViewController,可以在几个不同的视图之间切换。在我尝试在设置视图控制器中设置NSUserDefault布尔值并尝试在Flashcards视图控制器中读取这些值之前,一切正常

设置视图有一个开关,用于启用/禁用每个操作员(加法、减法等),如果启用了该类型的操作,则flashcard视图应随机显示一个闪存卡

我认为我的错误是我不理解数据封装、对象等的关键概念。如果有任何帮助,我将不胜感激

这是设置视图控制器。我甚至不知道如何把代码放到这个论坛,所以这可能是一个可笑的时刻。。。下面是:

//  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
这是抽认卡视图

//  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.h
#进口
@界面flashcardsViewController:UIViewController{
UILabel*第一个数字标签;
UILabel*第二个数字标签;
UILabel*应答器号码标签;
UILabel*运算符标签;
布尔加成启用;
布尔减法已被禁止;
布尔乘法可启用;
布尔分区已被取消;
}
@属性(非原子,保留)IBUILabel*firstNumberLabel;
@属性(非原子,保留)IBUILabel*secondNumberLabel;
@属性(非原子,保留)IBUILabel*answerNumberLabel;
@属性(非原子,保留)IBUILabel*运算符Label;
-(作废)按钮勾选:(id)发送者;
@结束
而且

/  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.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];
}
}
//flashcardsViewController.m
#导入“flashcardsViewController.h”
@flashcardsViewController的实现
@合成第一个数字标签;
@合成第二个数字标签;
@综合答案数字标签;
@合成算子标号;
-(无效)viewDidLoad{
srand(时间(0));//种子随机
//如果密钥不存在,则应分配以下密钥
如果(![[NSUserDefaults standardUserDefaults]boolForKey:@“additionKey”]){
[[NSUserDefaults standardUserDefaults]setBool:TRUE-forKey:@“additionKey”];
}   
如果(![[NSUserDefaults standardUserDefaults]boolForKey:@“减法键”]){
[[NSUserDefaults standardUserDefaults]setBool:TRUE-forKey:@“减法键”];
}
如果(![[NSUserDefaults standardUserDefaults]布尔工作:@“乘法键”]){
[[NSUserDefaults standardUserDefaults]setBool:TRUE-forKey:@“乘法键”];
}
如果(![[NSUserDefaults standardUserDefaults]布尔工作:@“divisionKey”]){
[[NSUserDefaults standardUserDefaults]setBool:TRUE-forKey:@“divisionKey”];
}
//以下内容应根据键分配每个BOOL变量
AdditionsEnabled=[[NSUserDefaults standardUserDefaults]布尔工作:@“additionKey”];
减法启用=[[NSUserDefaults standardUserDefaults]布尔工作:@“减法键”];
multiplicationIsEnabled=[[NSUserDefaults standardUserDefaults]布尔工作:@“multiplicationKey”];
divisionIsEnabled=[[NSUserDefaults standardUserDefaults]布尔工作:@“divisionKey”];
[超级视图下载];
}
-(无效)按钮勾选:(id)发件人{
int a=rand()%4;//随机数生成器(要进入循环的数字)
if(加法可加| | | | | | |减法可加| |乘法可加| |除法可加){
while(a<5){
开关(a){
案例0:
如果(AdditionsEnabled==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)];
运算符label.text=[[NSString alloc]initWithFormat:@“+”];
a=5;
}
否则a++;
打破
案例1:
如果(减法可启用==真){
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)];
运算符label.text=[[NSString alloc]initWithFormat:@“-”];
a=5;
}
否则a++;
打破
案例2:
if(乘法可启用==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)];
运算符label.text=[[NSString alloc]initWithFormat:@“×”];
a=5;
}
否则a++;
打破
案例3:
如果(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];
运算符label.text=[[NSString alloc]initWithFormat:@“÷”];
a=5;
}
否则a=0;
打破
违约:
打破
}
}       
}
其他的
{
UIAlertView*noOperatorSelectedAlert=[[UIAlertView alloc]initWithTitle:@“您尚未设置任何操作。”
信息:@“返回设置菜单并决定要执行的操作
//the following should assign the keys if they don't exist  
if (![[NSUserDefaults standardUserDefaults] boolForKey:@"additionKey"]){
    [[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:@"additionKey"];
}
//the following should assign the keys if they don't exist  
if (![[NSUserDefaults standardUserDefaults] objectForKey:@"additionKey"]){
    [[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:@"additionKey"];
}
-(void) buttonClicked:(id)sender {

    // the following should assign each BOOL variable based on the key
    NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
    additionIsEnabled = [defaults boolForKey:@"additionKey"];
    subtractionIsEnabled = [defaults boolForKey:@"subtractionKey"];
    multiplicationIsEnabled = [defaults boolForKey:@"multiplicationKey"];
    divisionIsEnabled = [defaults boolForKey:@"divisionKey"];

    int a = rand() %  4;
    if ( additionIsEnabled || subtractionIsEnabled ...
+ (void) initialize
{
    // in any +initialize, make sure it's being called on your class
    // +initialize is different from all other methods in this respect
    if ( [self isKindOfClass: [MyApplicationDelegate class]] == NO )
        return;    // being called on a superclass, don't do my stuff

    // set up default values for certain preferences
    NSMutableDictionary * defaults = [NSMutableDictionary new];
    [defaults setObject: [NSNumber numberWithBool: YES] forKey: @"additionKey"];
    [defaults setObject: [NSNumber numberWithBool: YES] forKey: @"subtractionKey"];
    [defaults setObject: [NSNumber numberWithBool: YES] forKey: @"multiplicationKey"];
    [defaults setObject: [NSNumber numberWithBool: YES] forKey: @"divisionKey"];

    // set this as the registration domain
    [[NSUserDefaults standardUserDefaults] registerDefaults: defaults];
    [defaults release];
}
- (void) updateFromPreferences
{
    // fetch current values from user defaults into your member variables
    additionIsEnabled = [[NSUserDefaults standardUserDefaults] boolForKey: @"additionKey"];
    // etc...
}

- (void) viewWillLoad
{
    // load variables from user defaults
    [self updateFromPreferences];

    // find out when the preferences have been changed
    // this will cause -updateFromPreferences to be called
    // whenever something changes preferences, inside the app or outside
    [[NSNotificationCenter defaultNotificationCenter] addObserver: self
                                                         selector: @selector(updateFromPreferences)
                                                             name: NSUserDefaultsDidChangeNotification
                                                           object: nil];
}

- (void) viewDidUnload
{
    // always remove notification observers.
    [[NSNotificationCenter defaultNotificationCenter] removeObserver: self
                                                                name: NSUserDefaultsDidChangeNotification
                                                              object: nil];
}

- (void) dealloc
{
    // add this to your existing dealloc routine
    [[NSNotificationCenter defaultNotificationCenter] removeObserver: self
                                                                name: NSUserDefaultsDidChangeNotification
                                                              object: nil];
}