0

我的服务器上有一个 plist,用于使用注释信息填充我的地图。当我从服务器读取它时,一切正常,并且在文档路径中创建了 plist 文件的副本。当没有互联网连接但它不起作用时,我正在尝试在文档路径中读取我的 plist。如果我在没有互联网的情况下编写代码以转到捆绑包 - 它可以工作但来自文档 - 不。(我已经更改了我的 Dropbox 中 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;
}
4

2 回答 2

1

嗨,以下代码将帮助您从以下位置阅读 plist NSDocumentDirectory

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 
}
于 2012-03-05T15:41:06.657 回答
-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 类中创建一个字典变量。

 .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


}
于 2012-03-06T11:05:29.860 回答