2016-11-29 1 views
0

comment définir la valeur textfiled en obtenant des données du serveurcomment définir la valeur textfiled en obtenant des données du serveur

Je reçois des données XML à partir du serveur, mais pas définir ces valeurs à textfield.can u s'il vous plaît me corriger s'il y a quelque chose avec le code ci-dessous

Customerdetails.h (modèle)

@interface Customerdetails : NSObject 
@property(nonatomic,strong)NSString*fst; 
@property(nonatomic,strong)NSString*lst; 
@property(nonatomic,strong)NSString*street; 
@property(nonatomic,strong)NSString*city; 

@end 

detailviewcontroller.m

#import "DetailViewController.h" 
#import "Customerdetails.h" 
@interface DetailViewController()<NSXMLParserDelegate> 
@property(nonatomic,strong)NSXMLParser*xmlparse; 
@property(nonatomic,strong)NSMutableString*tempstr; 
@property(nonatomic,strong)NSMutableString*foundvalue; 
@property Customerdetails*csd; 
@end 

@implementation DetailViewController 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    _csd=[[Customerdetails alloc]init]; 
    NSMutableURLRequest*req=[[NSMutableURLRequest alloc]init]; 
    _tempstr=[[NSMutableString alloc]init]; 
    NSURL*url=[NSURL URLWithString:@"http://www.thomas-bayer.com/sqlrest/CUSTOMER/4"]; 
    [req setURL:url]; 
    [[[NSURLSession sharedSession]dataTaskWithRequest:req completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
     // SMXMLDocument *document = [SMXMLDocument documentWithData:data error:&error]; 

     NSString*str=[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; 
     _xmlparse=[[NSXMLParser alloc]initWithData:data]; 
     _xmlparse.delegate=self; 
     [_xmlparse parse]; 
    }] resume]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     self.first.text=[self.csd fst]; 
     self.last.text=[self.csd lst]; 
     self.street.text=[self.csd street]; 
     self.city.text=[self.csd city]; 
    }); 

} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict;{ 

    _tempstr=[[NSMutableString alloc]initWithString:elementName]; 

} 
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName;{ 
    // sent when an end tag is encountered. The various parameters are supplied as above. 
    if([self.tempstr isEqualToString:@"FIRSTNAME"]){ 
     [self.csd setFst:_foundvalue]; 
     self.foundvalue=nil; 
     self.tempstr=nil; 
    } 
    if([self.tempstr isEqualToString:@"LASTNAME"]){ 
     [self.csd setLst:_foundvalue]; 
     self.foundvalue=nil; 
     self.tempstr=nil; 
    } 
    if([self.tempstr isEqualToString:@"STREET"]){ 
     [self.csd setStreet:_foundvalue]; 
     self.foundvalue=nil; 
     self.tempstr=nil; 
    } 

    if([self.tempstr isEqualToString:@"CITY"]){ 
     [self.csd setCity:_foundvalue]; 
     self.foundvalue=nil; 
     self.tempstr=nil; 
    } 


    if([elementName isEqualToString:@"CUSTOMER"]){ 
     NSLog(@"%@",self.csd); 
    } 
} 

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

    if([self.tempstr isEqualToString:@"FIRSTNAME"]){ 
     self.foundvalue=[[NSMutableString alloc]initWithString:string]; 
    } 
    if([self.tempstr isEqualToString:@"LASTNAME"]){ 
     self.foundvalue=[[NSMutableString alloc]initWithString:string]; 
    } 
    if([self.tempstr isEqualToString:@"STREET"]){ 
     self.foundvalue=[[NSMutableString alloc]initWithString:string]; 
    } 

    if([self.tempstr isEqualToString:@"CITY"]){ 
     self.foundvalue=[[NSMutableString alloc]initWithString:string]; 
    } 
} 

@end

+0

Quelle erreur obtenez-vous? –

+0

rien ne s'affiche dans les champs de texte ... j'obtiens 4 valeurs prénom, nom, rue et ville du serveur et essayant d'afficher dans les champs de texte – Nishanth

+0

vous devriez essayer de mettre label.text dans la méthode de délégué de NSXMLParser. –

Répondre

1

Vous définissez le texte de l'étiquette avant même que l'objet self.csd ne soit défini. Cet objet ne sera défini qu'une fois l'analyse terminée.

[[[NSURLSession sharedSession]dataTaskWithRequest:req completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
    // SMXMLDocument *document = [SMXMLDocument documentWithData:data error:&error]; 

    NSString*str=[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; 
    _xmlparse=[[NSXMLParser alloc]initWithData:data]; 
    _xmlparse.delegate=self; 
    [_xmlparse parse]; 
    }] resume]; 
//This part will get executed even before the parsing is done. 
// So self.csd is nil and so the label are getting empty string. 
dispatch_async(dispatch_get_main_queue(), ^{ 
    self.first.text=[self.csd fst]; 
    self.last.text=[self.csd lst]; 
    self.street.text=[self.csd street]; 
    self.city.text=[self.csd city]; 
    }); 

Maintenant, nous allons mettre l'étiquette, le texte dès que le XML est analysé mais attention avec ce que cela prendra du temps car il est dans le fil d'arrière-plan et l'interface utilisateur peut être inchangé pendant un certain temps.

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName;{ 
    // sent when an end tag is encountered. The various parameters are supplied as above. 
    if([self.tempstr isEqualToString:@"FIRSTNAME"]){ 
     [self.csd setFst:_foundvalue]; 
     //We are doing the UI stuff in main thread. 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      self.first.text = [self.csd fst]; 

     }); 
     self.foundvalue=nil; 
     self.tempstr=nil; 
    } 
    ... 

Maintenant, vous avez le self.csd prêt pour un autre traitement et l'interface utilisateur est également mise à jour.

1

Votre code pour installer les valeurs de votre XML appartient à l'intérieur du gestionnaire d'achèvement pour votre tâche de données:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    _csd=[[Customerdetails alloc]init]; 
    NSMutableURLRequest*req=[[NSMutableURLRequest alloc]init]; 
    _tempstr=[[NSMutableString alloc]init]; 
    NSURL*url=[NSURL URLWithString:@"http://www.thomas-bayer.com/sqlrest/CUSTOMER/4"]; 
    [req setURL:url]; 
    [[[NSURLSession sharedSession]dataTaskWithRequest:req completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
     // SMXMLDocument *document = [SMXMLDocument documentWithData:data error:&error]; 

     NSString*str=[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; 
     _xmlparse=[[NSXMLParser alloc]initWithData:data]; 
     _xmlparse.delegate=self; 
     [_xmlparse parse]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     self.first.text=[self.csd fst]; 
     self.last.text=[self.csd lst]; 
     self.street.text=[self.csd street]; 
     self.city.text=[self.csd city]; 
    }); 
    }] resume]; 
} 

Il peut y avoir d'autres problèmes avec votre code, mais qui doit certainement être changé .

La façon dont votre code actuel fonctionne le code pour installer les données dans vos champs de texte s'exécutera avant que la réponse du réseau soit arrivée.

+0

@Duncan ... merci – Nishanth