【问题标题】:Can't set a custom backgroundColor with an if-query in applicationDidFinishLaunching无法在 applicationDidFinishLaunching 中使用 if 查询设置自定义背景颜色
【发布时间】:2010-01-11 20:33:26
【问题描述】:

我的程序通常有一个标准背景:“black.jpg”。 在 applicationDidFinishLaunching 我做了以下事情:

   [window addSubview:viewController.view];
   [window makeKeyAndVisible];
   viewController.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"black.jpg"]];

我有一个漂亮的黑色背景。现在我想改变我的背景,为此我做了一个偏好。首选项的defaultValue是2,那为什么代码不起作用呢?:

[window addSubview:viewController.view];        
[window makeKeyAndVisible];
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
int bla = [prefs stringForKey:@"background_key"];
NSlog(@"%@", bla) //Console says 2!!
        if (bla == 2) {
            viewController.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"black.jpg"]];
        }

视图没有自定义背景。感谢您的帮助!

【问题讨论】:

    标签: iphone objective-c xcode


    【解决方案1】:

    编辑:查看 cmets 的真正原因:)

    第一次使用intValue

    int bla = [[prefs stringForKey:@"background_key"] intValue];
    

    然后比较。

    【讨论】:

    • NSLog(@"%@", [bla class]) 打印出什么?
    • 带intValue:(null),不带也
    • 那么,你有你的理由 - 设置未设置!你是如何设置偏好的?使用setInteger:forKey:?然后你必须使用integerForKey:阅读,而不是stringForKey:
    • 这样:(backgr 是一个 NSNumber)backgr = [[NSNumber alloc] initWithInt:2]; backgr = [prefs stringForKey:@"background_key"];
    • 但是这段代码没有设置首选项。您必须执行[prefs setInteger:2 forKey:@"background_key"] 之类的操作才能保存首选项。然后通过int bla = [prefs integerForKey:@"background_key"] 阅读。另外,设置好后不要忘记[prefs synchronize] 保存首选项!
    【解决方案2】:

    1) 嗯,%@ 限定符让我失望......我认为这是为 NS* 对象保留的。但是如果你得到2,那很酷。我通常会使用 %d 作为限定符

    2) int bla = [prefs stringForKey:@"background_key"]; 返回一个字符串,而不是一个 int ...

    3) 你的比较可能是失败的......

    【讨论】:

    • 2.不,偏好是一个 NSNumber,所以他返回一个 NSNumber。
    【解决方案3】:

    一系列独特的问题让你感到困惑:

    int bla = [prefs stringForKey:@"background_key"];
    

    bla 现在是一个 int 值,它保存一个 NSString 对象的地址。

    NSlog(@"%@", bla) //Console says 2!!
    

    应该如此,因为 %@ 说“在我传入的地址中获取对象,并询问描述”。由于字符串“2”的描述是“2”,所以您会看到“2”...如果您希望格式语句正确打印 int,则需要使用“%d”,而不是“%@”。

    if (bla == 2) {
        viewController.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"black.jpg"]];
    }
    

    但 bla 不是 2。它类似于 192322,因为它再次保存对象的地址,而不是指向对象的指针。

    如果您真的想要比较,请在 prefs 调用的结果上使用 intValue,正如其他人所说。我只是想你可能想了解为什么 NSLog 似乎误导了你。

    【讨论】:

      猜你喜欢
      • 2014-10-30
      • 2020-12-14
      • 2020-01-06
      • 2020-02-22
      • 2018-10-27
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      • 2012-06-04
      相关资源
      最近更新 更多