2012-04-05 9 views
0

私は別のクラスから呼び出されたplistのコントローラクラスを作成しています。コントローラクラスには読み込みと保存のメソッドがあり、読み込みメソッドはplistを開き、それを読み書きのために文書ファイルに保存します。この読み込みクラスでは、以前に保存されたすべての値をそれぞれの変数に置きます。plistに保存する前に値を失う変数

次に、別のクラスから呼び出されたSaveメソッド呼び出しでは、すべての値がパラメータとして渡され、新しい値が正しい変数に渡され、plistに渡されます。私のplistの辞書とその唯一の貯蓄1つの値とnullに他のリセット..私はどのようにこれらの変数は、それらの値を保持することを確認するのですか?

はここに私の.h

#import <Foundation/Foundation.h> 

@interface EngineProperties : NSObject { 

NSString *signature; 
NSNumber *version; 
NSNumber *request; 
NSNumber *dataVersion; 
NSMutableDictionary *cacheValue; 
//cachevalue Items 
NSNumber *man; 
NSNumber *mod; 
NSNumber *sub; 

} 

@property (copy, nonatomic) NSString *signature; 
@property (copy, nonatomic) NSNumber *version; 
@property (copy, nonatomic) NSNumber *request; 
@property (copy, nonatomic) NSNumber *dataVersion; 
@property (copy, nonatomic) NSMutableDictionary *cacheValue; 
//cachevalue Items 
@property (copy, nonatomic) NSNumber *man; 
@property (copy, nonatomic) NSNumber *mod; 
@property (copy, nonatomic) NSNumber *sub; 



- (void) readPlistData; 
- (void) saveData:(NSString *)methodName signature:(NSString *)pSignature Version:(NSNumber *)pVersion request:(NSNumber *)rNumber dataVersion:(NSNumber *)dvReturned cacheValue:(NSNumber *)cValue; 

@end 

で、ここに私の.m

#import "EngineProperties.h" 

@implementation EngineProperties 

@synthesize signature; 
@synthesize version; 
@synthesize request; 
@synthesize dataVersion; 
@synthesize cacheValue; 

@synthesize man; 
@synthesize mod; 
@synthesize sub; 



//This opens up and reads the current plist ready to be used 
-(void) readPlistData 
{ 
    // Data.plist code 
    // get paths from root direcory 
    NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); 
    // get documents path 
    NSString *documentsPath = [paths objectAtIndex:0]; 
    // get the path to our Data/plist file 
    NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"EngineProperties.plist"]; 

    // check to see if Data.plist exists in documents 
    if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath]) 
    { 
     // if not in documents, get property list from main bundle 
     plistPath = [[NSBundle mainBundle] pathForResource:@"EngineProperties" ofType:@"plist"]; 
    } 

    // read property list into memory as an NSData object 
    NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath]; 
    NSString *errorDesc = nil; 
    NSPropertyListFormat format; 
    // convert static property liost into dictionary object 
    NSDictionary *tempRoot = (NSMutableDictionary *)[NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc]; 
    if (!tempRoot) 
    { 
     NSLog(@"Error reading plist: %@, format: %d", errorDesc, format); 
    } 
    // assign values 
    self.signature = [tempRoot objectForKey:@"Signature"]; 
    self.version = [tempRoot objectForKey:@"Version"]; 
    self.request = [tempRoot objectForKey:@"Request"]; 
    self.dataVersion = [tempRoot objectForKey:@"Data Version"]; 

    man = [cacheValue objectForKey:@"Man"]; 
    mod = [cacheValue objectForKey:@"Mod"]; 
    sub = [cacheValue objectForKey:@"SubMod"]; 

    cacheValue = [tempRoot objectForKey:@"Cache Value"]; 
} 


- (void) saveData:(NSString *)methodName signature:(NSString *)pSignature Version:(NSNumber *)pVersion request:(NSNumber *)rNumber dataVersion:(NSNumber *)dvReturned cacheValue:(NSNumber *)cValue; 
{ 
    // get paths from root direcory 
    NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); 
    // get documents path 
    NSString *documentsPath = [paths objectAtIndex:0]; 
    // get the path to our Data/plist file 
    NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"EngineProperties.plist"]; 

    // set the variables to the values in the text fields 
    self.signature = pSignature; 
    self.version = pVersion; 
    self.request = rNumber; 
    self.dataVersion = dvReturned; 

    //do some if statment stuff here to put the cache in the right place or what have you. 
    if (methodName == @"manufacturers") 
    { 
     self.man = cValue; 
    } 
    else if (methodName == @"models") 
    { 
     self.mod = cValue; 
    } 
    else if (methodName == @"subMod") 
    { 
     self.sub = cValue; 
    } 

    self.cacheValue = [NSDictionary dictionaryWithObjectsAndKeys: 
         man, @"Manufacturers", 
         mod, @"Models", 
         sub, @"SubModels", nil]; 


    NSDictionary *plistDict = [NSDictionary dictionaryWithObjectsAndKeys: 
           signature, @"Signature", 
           version, @"Version", 
           request, @"Request", 
           dataVersion, @"Data Version", 
           cacheValue, @"Cache Value", nil]; 



    NSString *error = nil; 
    // create NSData from dictionary 
    NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:plistDict format:NSPropertyListXMLFormat_v1_0 errorDescription:&error]; 

    // check is plistData exists 
    if(plistData) 
    { 
     // write plistData to our Data.plist file 
     [plistData writeToFile:plistPath atomically:YES]; 

     NSString *myString = [[NSString alloc] initWithData:plistData encoding:NSUTF8StringEncoding]; 
     //  NSLog(@"%@", myString); 
    } 
    else 
    { 
     NSLog(@"Error in saveData: %@", error); 
     //  [error release]; 
    } 
} 


@end 

私はこれら三つのVARSに正しい値を維持する方法を見つけるためにしようとしていますです、男、モッズ、私はそれらをキャッシュ値辞書に入れることができます。

答えて

2

問題は、データを辞書の作成準備ができているときです。ここには

if (methodName == @"manufacturers") 
{ 
    self.man = cValue; 
} 
else if (methodName == @"models") 
{ 
    self.mod = cValue; 
} 
else if (methodName == @"subMod") 
{ 
    self.sub = cValue; 
} 

これは、文字列を(彼らはおそらく同じになることはありませんので、あなたが実際に文字列のアドレスを比較している)を比較するための正しい方法の代わりに、あなたがこの使用すべきではありません。

if ([methodName isEqualToString:@"manufacturers"]) 
{ 
    self.man = cValue; 
} 
else if ([methodName isEqualToString:@"models"]) 
{ 
    self.mod = cValue; 
} 
else if ([methodName isEqualToString:@"subMod"]) 
{ 
    self.sub = cValue; 
} 

を別の問題がされreadPlistDataでは、 "Man"、 "Mod"、 "SubMod"のキーを読み込んでいますが、辞書に書き込むものと同じでなければなりません: "Manufacturers"、 "Models"、 "SubModels" (どちらか一つが正しいかもしれないが、彼らはあなたが読んで同じキーを書いているように一致させる必要があります!)

最後に、あなたがEnginePropertiesのあなたがsaveDataに電話するか、新しいを作成しているたびに同じインスタンスを使用しています毎回オブジェクト?同じオブジェクトを使用していない場合は、呼び出すたびにiVarsがnilにリセットされます。

+0

を比較するthisを参照してください

- (void) saveData:(NSString *)methodName signature:(NSString *)pSignature Version:(NSNumber *)pVersion request:(NSNumber *)rNumber dataVersion:(NSNumber *)dvReturned cacheValue:(NSNumber *)cValue; 

を呼び出しているとき、私はあなたの変更をしましたが、私はまだ...これは何が起こるかで同じ問題を抱えています私は3つの変数の直後にそれぞれの呼び出しのための文章を記録します。 check ---> 245442(null)(null) check --->(null)140211(null) check --->(null)(null)(null)9276 –

+0

saveDataを呼び出すたびに私の最初の方法で設定した私のvarsはクリアされます。私は多分、もしそれらのそれぞれの文で古い値を使って他の変数を設定しなければならないと思います。 –

+0

更新された回答の最後に記載されている他の2つの問題を参照してください。 – lnafziger

0

まず第一に、あなたが文字列値

//This opens up and reads the current plist ready to be used 
-(void) readPlistData 
{ 
    // Data.plist code 
    // get paths from root direcory 
    NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); 
    // get documents path 
    NSString *documentsPath = [paths objectAtIndex:0]; 
    // get the path to our Data/plist file 
    NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"EngineProperties.plist"]; 

    // check to see if Data.plist exists in documents 
    if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath]) 
    { 
     // if not in documents, get property list from main bundle 
     plistPath = [[NSBundle mainBundle] pathForResource:@"EngineProperties" ofType:@"plist"]; 
    } 

    // read property list into memory as an NSData object 
    NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath]; 
    NSString *errorDesc = nil; 
    NSPropertyListFormat format; 
    // convert static property liost into dictionary object 
    NSDictionary *tempRoot = (NSMutableDictionary *)[NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc]; 
    man = [cacheValue objectForKey:@"Man"]; 
    mod = [cacheValue objectForKey:@"Mod"]; 
    sub = [cacheValue objectForKey:@"SubMod"]; 
    if (tempRoot && [tempRoot count]){ 
     // assign values 
     self.signature = [tempRoot objectForKey:@"Signature"]; 
     self.version = [tempRoot objectForKey:@"Version"]; 
     self.request = [tempRoot objectForKey:@"Request"]; 
     self.dataVersion = [tempRoot objectForKey:@"Data Version"]; 
     cacheValue = [tempRoot objectForKey:@"Cache Value"]; 
    } 

} 


- (void) saveData:(NSString *)methodName signature:(NSString *)pSignature Version:(NSNumber *)pVersion request:(NSNumber *)rNumber dataVersion:(NSNumber *)dvReturned cacheValue:(NSNumber *)cValue 
{ 
    // get paths from root direcory 
    NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); 
    // get documents path 
    NSString *documentsPath = [paths objectAtIndex:0]; 
    // get the path to our Data/plist file 
    NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"EngineProperties.plist"]; 

    // set the variables to the values in the text fields 
    self.signature = pSignature; 
    self.version = pVersion; 
    self.request = rNumber; 
    self.dataVersion = dvReturned; 

    //do some if statment stuff here to put the cache in the right place or what have you. 
    if (methodName isEqualToString:@"manufacturers") { 
     self.man = cValue; 
    } else if (methodName isEqualToString:@"models") { 
     self.mod = cValue; 
    } else if (methodName isEqualToString:@"subMod") { 
     self.sub = cValue; 
    } 

    self.cacheValue = [NSDictionary dictionaryWithObjectsAndKeys: 
        man, @"Manufacturers", 
        mod, @"Models", 
        sub, @"SubModels", nil]; 


    NSDictionary *plistDict = [NSDictionary dictionaryWithObjectsAndKeys: 
          signature, @"Signature", 
          version, @"Version", 
          request, @"Request", 
          dataVersion, @"Data Version", 
          cacheValue, @"Cache Value", nil]; 



    NSString *error = nil; 
    // create NSData from dictionary 
    NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:plistDict format:NSPropertyListXMLFormat_v1_0 errorDescription:&error]; 

    // check is plistData exists 
    if(plistData) { 
     // write plistData to our Data.plist file 
     [plistData writeToFile:plistPath atomically:YES]; 

     NSString *myString = [[NSString alloc] initWithData:plistData encoding:NSUTF8StringEncoding]; 
     //  NSLog(@"%@", myString); 
    } else { 
      NSLog(@"Error in saveData: %@", error); 
      // [error release]; 
    } 
} 
@end 
+0

私はちょうど私の答えを編集しました、ちょうどマイナーを変更しました。 –

+0

ありがとう私はそれを実装しようとしたばかりで、変数にcValueを渡しているif文でエラーが発生しています。 **予想される ']' **彼らは角括弧を持つように言わないのですか? –

+0

さて、私はそれが問題でなければならない、私はちょうどそこにチェック:(NSNumber *)cValue **; ** 'メソッドの定義を保存するので、私はちょうど最後にセミコロンを削除し、私は答えを編集しました。あなたは** ']' **の開閉を見逃したかもしれません。私にラインを見せてください。 –

関連する問題