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

Objective c if语句在设置其条件变量之前执行,objective-c,ios,xcode,uistoryboard,Objective C,Ios,Xcode,Uistoryboard,我有一个if语句,它的条件通过NSUserDefaults传递给这个实现文件,如下所示 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSString *code = [defaults objectForKey:@"codeKey"]; selectedCodeLocal = code; 在这段检索字符串变量的代码之后,我有一个if语句: if (selectedCodeLocal == @"1")

我有一个
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
,返回我的
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
的旧值

更新:这里是设置该键的地方。(在前面的视图中)

@菲罗兹·拉菲尔:这能回答你的问题吗?

我想你的问题在于你最喜欢的字符串比较

我想你的意思是:

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

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

我想你的问题是最受欢迎的字符串比较

我想你的意思是:

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

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

当您更改NSUserDefaults中的值时,请执行同步。比如说

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

应该是

if (selectedCodeLocal isEqual:@"1")

更改NSUserDefaults中的值时,请执行同步。比如说

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

应该是

if (selectedCodeLocal isEqual:@"1")

在加载并推送新的视图控制器后,如果将情节提要和序列连接到tableview单元格,则会调用
tableview:DidSelectRowatineXpath

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

在tableview控制器上的
prepareforsgue:sender:
方法中,可以设置详细视图控制器所需的任何数据<代码>表视图:如果您在情节提要中的表视图上使用序列,则didSelectRowAtIndexPath:太晚

其他想法:

  • 其他人都认为您应该使用
    IsequalString:
    ,而不是
    =
    。后者为您工作这一事实实际上是执行过程中的一个意外。你需要做正确的事情,而不是依赖它。使用“==”(在本例中是指针比较)是错误的

  • 说到做正确的事情,你应该考虑<代码> >选择代码<代码>是否真正属于你的用户偏好(NSULDER错误)。只需将该属性设置为detail view控制器的@property,并直接在
    prepareforsgue:sender:
    方法中设置该属性,就会更简洁


希望对您有所帮助。

在加载和推送新的视图控制器后,您的
tableview:didSelectRowAtIndexPath
将被调用

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

在tableview控制器上的
prepareforsgue:sender:
方法中,可以设置详细视图控制器所需的任何数据<代码>表视图:如果您在情节提要中的表视图上使用序列,则didSelectRowAtIndexPath:太晚

其他想法:

  • 其他人都认为您应该使用
    IsequalString:
    ,而不是
    =
    。后者为您工作这一事实实际上是执行过程中的一个意外。你需要做正确的事情,而不是依赖它。使用“==”(在本例中是指针比较)是错误的

  • 说到做正确的事情,你应该考虑<代码> >选择代码<代码>是否真正属于你的用户偏好(NSULDER错误)。只需将该属性设置为detail view控制器的@property,并直接在
    prepareforsgue:sender:
    方法中设置该属性,就会更简洁


希望能有所帮助。

这似乎是编写if语句条件的更好方法,尽管
=
IsequalString:
都可以工作,但它仍然不能解决变量未及时设置的问题。还有其他想法吗?
IsequalString:
不是编写if语句的“更好”方法。这是正确的方法。相等运算符,
==
,将测试两个指针是否指向同一个对象。使用字符串时很少出现这种情况。方法
isEqualToString:
实际上比较了指针的内容,在大多数情况下,这是您可能想要做的。这似乎是编写if语句条件的更好方法,尽管
==
isEqualToString:
都可以工作,但它仍然不能解决我的变量设置不及时的问题。还有其他想法吗?
IsequalString:
不是编写if语句的“更好”方法。这是正确的方法。相等运算符,
==
,将测试两个指针是否指向同一个对象。使用字符串时很少出现这种情况。方法
isEqualToString:
实际上比较指针的内容,在大多数情况下,这是您可能想要做的。if语句工作正常,谢谢。但是
NSUserDefaults
似乎仍然没有及时设置字符串变量
selectedCodeLocal
。一个简单的问题是,如果您直接操作它,为什么需要使用NSUserDefaults?目前,我看不出代码有任何问题,也许如果你能发布更多的代码,我将从另一个视图传递一个字符串,这就是我使用
NSUserDefaults
的原因。该字符串将决定(通过if语句)如何设置UITextView的文本属性