if语句在设置条件变量之前执行

时间:2012-01-19 23:30:50

标签: objective-c ios xcode uistoryboard

我有一个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:这回答了你的问题吗? storyboard

3 个答案:

答案 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:方法中设置该属性,就会更加清晰。

希望有所帮助。