【问题标题】:Somehow NSUserdefaults save does not work不知何故 NSUserdefaults 保存不起作用
【发布时间】:2012-10-05 08:47:49
【问题描述】:

class 1 中,我保存了一个转换为stringint,在class 2 中我尝试加载这个字符串,由于某种原因它不起作用,当我写出我从@987654326 中取出的字符串时@ 到class 2 中的文本框,该文本框保持为空。 当我在class 1 中做同样的事情时,文本框变为“1”。

1.m 级

- (void)viewDidLoad
{
[super viewDidLoad];
countForString = 1;
saveString = [[NSString alloc]initWithFormat:@"%i", countForString];
[self SaveTextBox:saveString :@"Number"];
}

-(void)SaveTextBox:(NSString*)string :(NSString*)stringsave
{
NSString *savestring = string;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:savestring forKey:stringsave];
[defaults synchronize];
}

2.m 级

- (void)viewDidLoad
{
[super viewDidLoad];
[self loadString:@"Number":teamString];
tbTeamPlayer.text = teamString;
}

-(void)loadString:(NSString *)location:(NSString *)saveInString
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *loadstring = [defaults objectForKey:location];
saveInString = loadstring;
} 

【问题讨论】:

标签: objective-c xcode


【解决方案1】:

您确实需要处理命名变量,并使用参数命名。这是 ObjC 中最好的功能之一。

据我了解,您的问题是您认为 saveInString = loadstring; 会返回一些东西。它不是。调用方法时复制变量的指针。

对于返回值,使用返回值。

我强烈建议从一本关于 Objective C 的好书开始,因为这段代码在语言方面存在很大的问题。

【讨论】:

    【解决方案2】:

    loadString:location: 不会改变saveInString 的值,它所做的只是覆盖局部变量。您需要返回字符串并设置该值,例如

    tbTeamPlayer.text = [self loadString:someLocation];
    

    并将 loadString 更改为:

    - (NSString *)loadString:(NSString *)location
    {
        return [[NSUserDefaults standardUserDefaults] stringForKey:location];
    }
    

    【讨论】:

    • 我还没有完全理解,但是非常感谢。
    • 您尝试在 loadString: 方法中修改的字符串 saveInString 与您传入的字符串不同,它是仅为该方法创建的本地副本。所以你可以修改它,但这些更改不会反映在原始字符串中。处理这个问题的最好方法是返回一个字符串并覆盖原来的字符串
    【解决方案3】:

    在您的 loadString 方法中,创建了 saveInStringnew reference。所以它不能反映对原始参考的任何新修改

    参考nsstring-returns-empty-from-a-return-method链接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      • 2014-09-29
      • 2013-04-22
      相关资源
      最近更新 更多