改变UIView的背景颜色

3

我遇到了一个问题,想要设置一个 UIView 的背景颜色。我正在使用下面的代码:

self.view.backgroundColor = [UIColor colorWithRed:0 
                                            green:0.675 
                                             blue:0.929 
                                            alpha:1];

这在我刚启动应用程序时设置背景色时可以正常工作,但是当我想要从通知中心小部件启动应用程序后更新背景色时,它就不会改变颜色。

编辑 - 更多细节:

当从通知中心启动应用程序时,将调用AppDelegate方法,该方法将调用另一个方法以更新背景色,并将调用的URL Scheme保存为NSString。

我已经验证了方法调用正常。

我的问题是,尽管已调用该方法,但颜色没有更新。
3个回答

3

我已经解决了我的问题。在AppDelegate.m文件中,当我获取应用程序启动时的URL的方法中,我初始化了一个新的ViewController而不是使用旧的ViewController,这导致了所有错误。感谢您的帮助!


1
不要忘记导入QuartzCore - return true

0

在视图出现的控制器的 viewWillAppear 中更新你的颜色。设置断点以确保代码被调用并且所引用的视图不是 nil

如果你只想要“保存”这种颜色而不显示它,可以使用 NSUserDefaults。你只能存储原始类型,所以你可以例如这样做。

// save
[[NSUserDefaults standardUserDefaults] setObject:@"0,0.675,0.929" forKey@"savedColor"];

// retrieve
NSString *colorString = [[NSUserDefaults standardUserDefaults] objectForKey:@"savedColor"];
NSArray *c = [colorString componentsSeparatedByString:@","];
CGFloat r = [c[0] floatValue];
CGFloat g = [c[1] floatValue];
CGFloat b = [c[2] floatValue];
UIColor *color = [UIColor colorWithRed:r green:g blue:b alpha:1];

或许更好的方式是更明确、更简洁。

// save
[[NSUserDefaults standardUserDefaults] setObject:
  @{@"red" : @0, @"green" : @0.675, @"blue" : @0.929} forKey:@"savedColor"];

// retrieve
NSDictionary *c = [[NSUserDefaults standardUserDefaults] objectForKey@"savedColor"];
UIColor *color = [UIColor 
   colorWithRed:c[@"red"]  green:c[@"green"] blue:c[@"blue"] alpha:1];

现在把所有内容放入方便方法中:
-(void)saveColorToUserDefaults:(UIColor*)color withKey:(NSString*)key {
    CGFloat red, green, blue, alpha;
    [color getRed:&red green:&green blue:&blue alpha:&alpha];
    [[NSUserDefaults standardUserDefaults] setObject:
       @{@"red": @(red), @"green" : @(green), @"blue" : @(blue), @"alpha" : @(alpha)}
       forKey: key];
}

-(UIColor*)colorFromUserDefaultsWithKey:(NSString *)key {
   NSDictionary *c = [[NSUserDefaults standardUserDefaults] objectForKey@"savedColor"];
   return = [UIColor colorWithRed:c[@"red"]  green:c[@"green"] 
                             blue:c[@"blue"] alpha:c[@"alpha"]];
}

我的ViewDidAppear方法只有在应用程序启动时才会被调用。我知道,这很奇怪,但我可能做错了什么? - fredpi
将代码放入您自己的公共方法 updateDisplay 中,并在收到通知后从应用程序委托中调用该方法。 - Mundi
你没有提供足够的信息来解决问题。展示“并调用另一个方法,在其中应更新背景颜色”。 - Mundi

0

如果您从通知中心启动应用程序,这意味着应用程序从后台返回到前台。在这种情况下,您需要在applicationDidEnterBackground和applicationDidEnterForeground方法中处理uiview的背景。


它应该真正地设置在 ViewWillAppear 中。 - JAL
抱歉,也许我没有很好地描述我的问题。当应用程序从通知中心启动时,将调用一个AppDelegate方法,该方法将被调用的URL Scheme保存为NSString,并调用另一个方法,在该方法中应更新背景颜色。方法调用正常工作;我已经使用NSLogs进行了测试。 - fredpi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接