2012-02-18 13 views
0

私はマップに注釈情報を埋め込むために私のサーバーにplistを持っています。 私はサーバからすべての作業を読むとき& plistファイルのコピーがドキュメントのパスに作成されます。 インターネットに接続されていないのにドキュメントパスでplistを読み込もうとしていますが、動作しません。 インターネットがないときにバンドルに行くために自分のコードを書いています。 (私はドロップボックスのplistファイルのパスを質問のためだけに変更しました) 私のコードで何が間違っていますか? アドバイスをいただきありがとうございます。文書からplistを読んでください

次のコード
- (void) showMap 
{ 
storsInfosArr = [[NSArray alloc]initWithContentsOfURL: 
       [NSURL URLWithString:@"http://dl.dropbox.com/u/4082823/AppsFiles/test.plist"]]; 

NSString *error; 
NSString *rootPath = 
[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) objectAtIndex:0]; 
NSString *plistPath = [rootPath stringByAppendingPathComponent:@"test.plist"]; 
NSArray *tmpArr = [NSArray arrayWithArray:storsInfosArr]; 
NSData *tmpData = [NSPropertyListSerialization dataFromPropertyList:tmpArr format:NSPropertyListXMLFormat_v1_0 errorDescription:&error]; 

if(tmpData) 
{ 
    [tmpData writeToFile:plistPath atomically:YES]; 
} 

else 

{ 
    NSLog(@"%@",error); 
} 

//Check if the array loaded from server is not complete, load from docs: 
if(tmpArr.count == 0) 
{ 
    NSString *rootPath = 
    [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString *plistPath = [rootPath stringByAppendingPathComponent:@"stores.plist"]; 

    NSLog(@"docsPlistPath = %@",plistPath); 

    // Build the array from the plist 
    NSMutableArray *tmpArray = [[NSMutableArray alloc] initWithContentsOfFile:plistPath]; 
    self.storsInfosArr = tmpArray; 
} 

for (NSDictionary *currStoreDict in storsInfosArr) 
{ 
    StoreAnnotation *stAnnotation = [[StoreAnnotation alloc] initWithDictionary:currStoreDict]; 
    [myMapView addAnnotation:stAnnotation]; 
} 

myMapView.showsUserLocation = YES; 

CLLocationCoordinate2D tmpCoord2d = {31.48489338689016, 35.5517578125}; 
MKUserLocation *userLocation = myMapView.userLocation; 
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.location.coordinate,390000.0, 390000.0); 
[myMapView setRegion:region animated:NO]; 
myMapView.mapType = MKMapTypeStandard; 
self.myMapView.centerCoordinate = tmpCoord2d; 
} 

答えて

1

こんにちはNSDocumentDirectoryからPLISTを読んであなたを助ける:

if(netConnection==0) 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 

    if (!documentsDirectory) { 
     NSLog(@"Documents directory not found!"); 
    } 

    NSArray *myWords = [@"Data.plist" componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"/"]]; 
    NSString *PlistFilePath = [documentsDirectory stringByAppendingPathComponent:[myWords lastObject]]; 

    NSLog(@"%@",PlistFilePath); 

    NSDictionary *tempDict = [[NSDictionary alloc] initWithContentsOfFile:PlistFilePath]; 

    //Load Plist root element into Dictionary object Fist 

    self.dataDict = tempDict; 

    [tempDict release]; 

    //From DataDict retrieve the Array 
} 
+0

ありがとうございます。しかし、self.dataDictonary = tempDictにエラーが表示されます。 dataDictionaryは何ですか? –

+0

dataDicitionaryはplistのRoot要素にアクセスするための変数です。ルート要素は、plist内の残りの値にアクセスできるようにします。 – Ram

-1

のplistのルート要素は、他のオブジェクトにアクセスする前に、辞書変数にロードする必要があります。

<plist version="1.0"> 
    <dict> 
    <key>Levels</key> //this is Root Element 

    <array> 
    <dict> 
<key>Title</key><string>Screen Based Videos</string> 
    </dict> 

    <dict> 
    <key>Title</key><string>Action Based Videos</string> 
    </dict> 

    </array> 
    </dict> 
    </plist> 

最初に、App Delegate Classで辞書変数を作成します。

.h AppDelClass 

NSDictionary *DataDict; 

@property(nonatomic,retain) NSDictionary *DataDict; 



.M AppDelClass 

@sythesize DataDict; 

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

{ 

Check Network Connection using Rechability Class form Apple Doc 

NSURL *XmlDataURL=[NSURL URLWithString:@"http://example.com/ideploy/testing/Data.plist"]; 


if(NetConnection==YES) 
{ 


    theRequest = [NSURLRequest requestWithURL:XmlDataURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60]; 
    receivedData = [[NSMutableData alloc] initWithLength:0]; 
    Connection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES]; 

} 

else 
{ 


    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

NSString *documentsDirectory = [paths objectAtIndex:0]; 
    if (!documentsDirectory){ 
     NSLog(@"Documents directory not found!"); 
    } 
    NSArray *myWords = [@"Data.plist" componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"/"`]]; 
NSString *PlistFilePath = `[documentsDirectory stringByAppendingPathComponent:[myWords lastObject]]; 

NSLog(@"%@",PlistFilePath); 

NSDictionary *tempDict = [[NSDictionary alloc] initWithContentsOfFile:PlistFilePath]; 

//Load Plist root element into Dictionary object Fist 

self.dataDict = tempDict; 

[tempDict release]; 

} 

//Root Class Implementation 
.h file 

NSArray *tableDataSource; 

@property (nonatomic, retain) NSArray *tableDataSource; 

.M file 

-(void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    NSArray *tempArray = [[NSArray alloc] init]; 
    self.tableDataSource = tempArray; 
    [tempArray release]; 

RootClassAppDelegate *AppDelegate = (RootClassAppDelegate *)[[UIApplication sharedApplication] delegate]; 

self.tableDataSource = [AppDelegate.data objectForKey:@"Levels"]; 

    NSLog(@"%i",[tableDataSource count]); 

// form the tableDataSource Array you can Access remaining elemements 


} 
+0

私はあなたの答えのいくつかを見てきました。あなたの答えが正しくフォーマットされていることを確認する必要があります。この答えのようにソートが必要です。なぜあなたは '
'のようなものは必要ないのですか?コードを追加するときは、4つのスペースしか必要としません。そして、あなたの答えは困惑しているように見えます。 – Popeye