我有一个if
语句,条件通过NSUserDefaults
传递给此实现文件,如下所示。
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *code = [defaults objectForKey:@"codeKey"];
selectedCodeLocal = code;
在此代码检索字符串变量之后,我有一个if语句:
if (selectedCodeLocal == @"1")
textView.text = "@blah blah blah";
else
textview.text = "@abcdefghijklmnop";
当我构建并运行时,似乎传递了变量IS,但是在if
语句执行之后它才被传递。
我在这段代码中有NSLog
个位置,它返回我的selectedCodeLocal
字符串变量,而变量的值总是落后一步。 (例如,如果我首先将其传递为4,则将其作为1传递,它将首先在日志中返回为1,然后返回为4,然后返回为1)抱歉,如果我对此感到困惑。
更新:
- (void)viewDidLoad {
[super viewDidLoad];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults synchronize];
selectedCodeLocal = [defaults objectForKey:@"codeKey"];
NSLog(@"set: %@",selectedCodeLocal);
self.navigationItem.title = selectedCodeLocal;
[textView setClipsToBounds:NO];
[textView setEditable:NO];
[textView setFrame:CGRectMake(20, 100, 50, 50)];
if ([selectedCodeLocal isEqualToString:@"100"])
textView.text = @"abc";
else
textView.text = @"xyz";
}
NSLog仍然显示旧值selectedCodeLocal
。
更新:这是设置密钥的位置。 (在上一个视图中)
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//Get the selected code
NSString *selectedCode = nil;
if(searching)
selectedCode = [copyListOfItems objectAtIndex:indexPath.row];
else {
NSDictionary *dictionary = [listOfItems objectAtIndex:indexPath.section];
NSArray *array = [dictionary objectForKey:@"codesKey"];
selectedCode = [array objectAtIndex:indexPath.row];
}
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:selectedCode forKey:@"codeKey"];
[defaults synchronize];
}
@Firoze Lafeer:这回答了你的问题吗?
答案 0 :(得分:2)
更改NSUserDefaults中的值时,请执行同步。例如
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@"4" forKey:@"codeKey"];
[defaults synchronize];
也
if (selectedCodeLocal == @"1")
应该是
if (selectedCodeLocal isEqual:@"1")
答案 1 :(得分:1)
我认为你的问题是老字号,字符串比较。
我认为你的意思是:
if ([selectedCodeLocal isEqualToString:@"1"])
或类似的东西(自从我写了Obj-C以来已经过了一年多)。
答案 2 :(得分:1)
使用故事板和附加到tableview单元格的segue,在加载并推送新视图控制器后,您的tableView:didSelectRowAtIndexPath
将被称为。
换句话说,在您已经读取值之后,您在用户的默认设置中设置此键。
设置详细视图控制器所需的任何数据的正确时间是在tableview控制器上的prepareForSegue:sender:
方法中。如果您在故事板中的tableview上使用segue,则tableView:didSelectRowAtIndexPath:
为时已晚。
其他想法:
其他人都应该使用isEqualToString:
,而不是==
。后者为你工作的事实实际上是一个意外。您需要做正确的事情而不依赖于此。使用'=='(在这种情况下是指针比较)是错误的。
说到做正确的事情,您应该考虑selectedCode
是否真的属于您的用户偏好(NSUserDefaults)。只需将其设置为详细视图控制器的@property并直接在prepareForSegue:sender:
方法中设置该属性,就会更加清晰。
希望有所帮助。