2016-11-29 6 views
0

wie immer textfiled Wert zu setzen, indem Daten vom Serverwie textfiled Wert zu setzen, indem Daten vom Server

bekommen i XML-Daten vom Server, aber nicht in der Lage Satz textfield.can diese Werten sind immer u bitte korrigieren Sie mich, wenn es irgend etwas mit dem Code unten

Customerdetails.h (Modell)

@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

Welchen Fehler bekommen Sie? –

+0

nichts wird in Textfeldern angezeigt ... Ich bekomme 4 Werte Vorname, Nachname, Straße und Stadt vom Server und versuchen, in Textfelder anzuzeigen – Nishanth

+0

Sie sollten versuchen, label.text in NSXMLParser der Delegate-Methode. –

Antwort

1

Sie setzen den Text der Beschriftung, bevor das Objekt self.csd überhaupt gesetzt wird. Dieses Objekt wird erst nach dem Parsen gesetzt.

[[[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]; 
    }); 

Jetzt werden wir das Label, Text gesetzt, sobald die xml analysiert wird aber mit diesem, da dies vorsichtig sein wird einige Zeit dauern, da es in Hintergrund-Thread und UI kann für einige Zeit unverändert.

- (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; 
    } 
    ... 

Jetzt Dadurch haben Sie sowohl die self.csd bereit für eine andere Verarbeitung und wird auch UI in aktualisiert.

1

Ihr Code die Werte aus Ihrem XML gehört innerhalb der Abschluss-Handler für Ihre Daten Aufgabe zu installieren:

- (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]; 
} 

Es können andere Probleme mit Ihrem Code, aber das muss sicherlich geändert werden .

Wie Ihr aktueller Code funktioniert Der Code zum Installieren von Daten in Ihre Textfelder wird ausgeführt, bevor die Netzwerkantwort eintrifft.

+0

@Duncan ... danke – Nishanth