2012-02-18 110 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

嗨下面的代码将帮助你在阅读的plist从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?我没有字典变量,如果这是什么.. – 2012-03-05 16:31:20

+0

dataDicitionary是变量用于访问plist的根元素。根元素允许访问plist内的剩余值。 – Ram 2012-03-07 18:16:53

-1

根元素在字典变量中加载访问其他对象之前。

<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个空格。正因为如此,你的答案看起来令人费解,所以-1。 – Popeye 2012-08-21 16:53:43