0

我有一个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";

当我构建并运行时,似乎正在传递变量,但直到if语句执行之后才传递。

NSLog我在这段代码周围有地方's 返回我的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:这能回答你的问题吗? 故事板

4

3 回答 3

2

当您更改 NSUserDefaults 中的值时,请进行同步。例如

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@"4" forKey:@"codeKey"];
[defaults synchronize];

if (selectedCodeLocal == @"1")

真的应该

if (selectedCodeLocal isEqual:@"1")
于 2012-01-19T23:45:11.700 回答
1

我认为您的问题是最喜欢的字符串比较。

我想你的意思是:

 if ([selectedCodeLocal isEqualToString:@"1"])

或类似的东西(我写 Obj-C 已经一年多了)。

于 2012-01-19T23:33:37.067 回答
1

使用情节提要和附加到 tableview 单元格的 segue,您tableView:didSelectRowAtIndexPath将在新的视图控制器加载和推送后被调用。

因此,换句话说,在您已经读取该值之后,您将在用户的默认值中设置此键。

设置详细视图控制器所需的任何数据的正确时间是在prepareForSegue:sender:tableview 控制器上的方法中。tableView:didSelectRowAtIndexPath:如果您在情节提要的 tableview 上使用 segue,则为时已晚。

其他想法:

  • 其他人都是正确的,你应该使用isEqualToString:,而不是==。后者为您工作的事实确实是实施的意外。你需要做正确的事,而不是依赖它。使用'=='(在这种情况下是指针比较)是错误的。

  • 说到做正确的事,您应该考虑是否selectedCode真的属于您的用户偏好(NSUserDefaults)。prepareForSegue:sender:将其设置为详细视图控制器的 @property 并直接在您的方法中设置该属性会更干净。

希望有帮助。

于 2012-01-20T02:07:03.160 回答