2010-09-16 33 views
0

Dans mon application iPhone, j'ai un appSettings.plist. Cela me permet, mais aussi aux autres de simplement changer certains paramètres. L'un des paramètres est la couleur prédominante de l'application. Le .plist ressemble à ceci:Entier à l'aide CGFloat requise

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
<key>Red</key> 
<integer>255</integer> 
<key>Green</key> 
<integer>123</integer> 
<key>Blue</key> 
<integer>124</integer> 
<key>compositeRGB</key> 
</dict> 
</plist> 

Dans mon code, je lis ce fichier, et essayer de faire un UIColor de ces trois numéros. Je dois admettre que je ne connais pas grand chose à propos de CGFLoats, et je soupçonne que c'est la cause de mes problèmes. C'est ce que je fais:

-(void)readAppSettings 
{ 
NSString *path = [[NSBundle mainBundle] bundlePath]; 
NSString *finalPath = [path stringByAppendingPathComponent:@"appSettings.plist"]; 
NSDictionary *plistDictionary = [[NSDictionary dictionaryWithContentsOfFile:finalPath] retain]; 

unsigned int RedComponent = [[plistDictionary objectForKey:@"Red"]intValue]; 
unsigned int GreenComponent = [[plistDictionary objectForKey:@"Green"]intValue]; 
unsigned int BlueComponent = [[plistDictionary objectForKey:@"Blue"]intValue]; 

appColor = [UIColor colorWithRed: ((float) RedComponent/255.0f) 
      green: ((float) GreenComponent/255.0f) 
     blue:((float) BlueComponent/255.0f) 
      alpha:1.0f]; 
} 

chaque fois que j'essaie d'utiliser appColor comme UIColor, plantage de mon application, avec l'erreur suivante:

« - [__ NSCFArray CGColor]: sélecteur non reconnu envoyé à l'instance 0x7b0ab20 '

Could somebody explain to me what I'm doing wrong. You don't have to be polite. 

Répondre

2

vous devez conserver appColor et le libérer dans votre méthode dealloc. Vous déréférencement un mauvais pointeur très probablement

Le Memory Management Programming Guide peut être une bonne référence

+0

Merci beaucoup. Cela a fait l'affaire. Je me débattais énormément avec le CGFLoat, que je négligeais d'une chose si basique. – Sjakelien

+0

J'ai également été assez perplexe par "- [__ NSCFArray CGColor]:" dans le message d'erreur, mais je n'aurais pas dû faire attention à ça je suppose. – Sjakelien

+0

Les erreurs de mémoire de @Sjakelien comme celle-là sont notoirement difficiles à traquer. Un moyen utile de les trouver est de courir avec les zombies activés. – cobbal

0

Works pour moi;)

#import <UIKit/UIKit.h> 

@interface deleteColorAppDelegate : NSObject <UIApplicationDelegate> { 
    UIWindow *window; 
    UINavigationController *navigationController; 
    UIColor *appColor; 
} 

@property (nonatomic, retain) UIColor *appColor; 

@property (nonatomic, retain) IBOutlet UIWindow *window; 

@property (nonatomic, retain) IBOutlet UINavigationController *navigationController; 

-(UIColor*)readAppSettings; 

@end 


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    // Override point for customization after application launch. 
    // Add the navigation controller's view to the window and display. 

    [self readAppSettings]; 
    UILabel *label = [[UILabel alloc] init]; 
    label.textColor = appColor; 
    label.text = @"This is a test"; 
    label.frame = CGRectMake(100, 100, 100, 40); 

    [navigationController.view addSubview:label]; 
    [window addSubview:navigationController.view]; 
    [window makeKeyAndVisible]; 
    [label release]; 
    return YES; 
} 

- (void)applicationWillTerminate:(UIApplication *)application { 

    // Save data if appropriate. 


} 

-(UIColor*)readAppSettings 
{ 
    NSString *path = [[NSBundle mainBundle] bundlePath]; 
    NSString *finalPath = [path stringByAppendingPathComponent:@"appSettings.plist"]; 
    NSDictionary *plistDictionary = [[NSDictionary dictionaryWithContentsOfFile:finalPath] retain]; 

    float RedComponent = [[plistDictionary objectForKey:@"Red"]floatValue]/255.0f ; 
    float GreenComponent = [[plistDictionary objectForKey:@"Green"]floatValue]/255.0f ; 
    float BlueComponent = [[plistDictionary objectForKey:@"Blue"]floatValue]/255.0f ; 

    appColor = [UIColor colorWithRed: RedComponent 
           green: GreenComponent 
           blue: BlueComponent 
           alpha: 1.0f]; 
    return [appColor retain]; 
} 



- (void)dealloc { 
    [appColor release]; 
    [window release]; 
    [navigationController release]; 
    [super dealloc]; 
}