我开始从viewDidLoad获取数据的过程,并使用该数据填充NSMutableArray。但是,当我想填充UIPicker时,我不能,因为该阵列中没有更多数据。我是怎么丢失的???请帮忙 :(

@synthesize activityIndicator;
@synthesize pckCountries;

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {

 countriesList = [[NSMutableArray alloc] initWithCapacity:20];
 [self getCountriesList];

 NSLog(@"%@", [countriesList count]);


 [super viewDidLoad];

}

- (void)dealloc {
 [activityIndicator release];
    [xmlParser release];
    //[soapResults release];

    [super dealloc];
}

- (void) getCountriesList{


 NSString *soapMsg =
 [NSString stringWithFormat:
  @"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
  "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
  "<soap:Body>"
  "<getCountries xmlns=\"http://www.smsbug.com/api/\" />"
  "</soap:Body>"
  "</soap:Envelope>"
  ];

 NSURL *url = [NSURL URLWithString:
      @"http://www.smsbug.com/api/webservice.asmx"];
    NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
 NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMsg length]];
 [req addValue:@"text/xml; charset=utf-8"
forHTTPHeaderField:@"Content-Type"];
    [req addValue:@"http://www.smsbug.com/api/getCountries"
forHTTPHeaderField:@"SOAPAction"];
    [req addValue:msgLength forHTTPHeaderField:@"Content-Length"];
    [req setHTTPMethod:@"POST"];
    [req setHTTPBody: [soapMsg dataUsingEncoding:NSUTF8StringEncoding]];
 conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];
    if (conn) {
        webData = [[NSMutableData data] retain];


  }
}

-(void) connection:(NSURLConnection *) connection
didReceiveResponse:(NSURLResponse *) response {
 [webData setLength: 0];
}

-(void) connection:(NSURLConnection *) connection
 didReceiveData:(NSData *) data {
 [webData appendData:data];
 NSLog(@"%@", webData);
}

-(void) connection:(NSURLConnection *) connection
  didFailWithError:(NSError *) error {
 [webData release];
 [connection release];
}

-(void) connectionDidFinishLoading:(NSURLConnection *) connection {
    NSLog(@"DONE READING WEATHER WEB SERVICE. Received Bytes: %d", [webData length]);
    NSString *theXML = [[NSString alloc]
                        initWithBytes: [webData mutableBytes]
                        length:[webData length]
                        encoding:NSUTF8StringEncoding];
    //---shows the XML to test---
    NSLog(theXML);

    [theXML release];

 // stop activity indicator animation
    [activityIndicator stopAnimating];


 //-----------------------------------------------------------------
 // start parsing received XML message
 //-----------------------------------------------------------------
 if (xmlParser)
 {
  [xmlParser release];
 }
 xmlParser = [[NSXMLParser alloc] initWithData: webData];
 [xmlParser setDelegate:self];
 [xmlParser setShouldResolveExternalEntities:YES];
 [xmlParser parse];

 // clear memory
    [connection release];
    [webData release];
}

-(void) parser:(NSXMLParser *) parser
didStartElement:(NSString *) elementName
  namespaceURI:(NSString *) namespaceURI
 qualifiedName:(NSString *) qName
 attributes:(NSDictionary *) attributeDict {

 //NSLog(elementName);
 if ([elementName isEqualToString:@"Country_Name"])
 {
  countryFound = YES;
 }
}

-(void)parser:(NSXMLParser *) parser foundCharacters:(NSString *)string
{

  if([string isEqualToString:@"Data Not Found"])
  {
   errorOccured = YES;
  }
  else if(countryFound == YES)
  {
   //NSLog(string);
   [countriesList addObject:string];

  }
  else
  {
   [soapResults appendString: string];
  }
}

-(void)parser:(NSXMLParser *)parser
didEndElement:(NSString *)elementName
 namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
{
 if(errorOccured == YES)
 {
  UIAlertView *alert = [[UIAlertView alloc]
         initWithTitle:@"No Data!"
         message:@"Sorry"
         delegate:self
         cancelButtonTitle:@"OK"
         otherButtonTitles:nil];
  [alert show];
  [alert release];
  [soapResults setString:@""];
  errorOccured = FALSE;
 }
 else
 {
  if ([elementName isEqualToString:@"Country_Name"])
  {
   countryFound = FALSE;
  }
 }
}

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
 return 1;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
 return countriesList.count;
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
 return [countriesList objectAtIndex:row];
}

最佳答案

[super viewDidLoad]应该是viewDidLoad方法中的第一个调用。
有一个泄漏-您应该在dealloc方法中调用[countriesList release]
NSURLRequest是异步的。以及NSXMLParser。因此,在下载/解析完成之前,将调用所有选择器委托方法。因此,在所有委托方法中,应检查countriesList是否等于nil
解析完成后(使用parserDidEndDocument:方法来接收此消息),您应显式调用[picker reloadAllComponents]

07-24 18:56
查看更多