2012-02-18 2 views
0

내지도에 주석 정보를 채우기위한 plist가 있습니다. 서버에서 읽을 때 모든 작업 & plist 파일의 복사본이 문서 경로에 만들어집니다. 인터넷 연결이 없는데도 문서 경로에서 내 plist를 읽으려고하는데 작동하지 않습니다. 인터넷에 연결되어 있지 않아도 작동하지만 문서에서는 안되는 경우 번들로 코드를 작성하고 있습니다. (내 Dropbox에서 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에 도움이 될 것입니다 : 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의 루트 요소에 액세스하는 데 사용되는 변수입니다. 루트 요소는 plist 내의 나머지 값에 액세스 할 수 있습니다. – Ram

-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