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