2016-11-06 5 views
-1

Ich habe versucht, JSON-Daten von einem Webserver in einem Tableviewcontroller anfügen. Dies ist mein aktueller Code.JSON zu Tableview

Das NSlog von _datalist druckt das JSON, aber die anderen Methoden, um die Daten wirklich in Zellen zu setzen, tut nicht .. Der Code sieht korrekt aus, und da das _datalist NSarray tatsächlich die Daten erhält, bin ich nicht sicher, wie handle damit. Deshalb brauche ich deine Hilfe und deinen Rat.

Was ich herausgefunden habe, die Methode, wo die Zellen mit den JSON-Daten initialisiert werden, kann es entweder nicht abrufen oder verwenden. Mein Schlüssel war, dass ich die eingehenden Daten verschlüsseln muss?

#import "TopUsersViewController.h" 

@interface TopUsersViewController() 
@property NSArray* dataList; 
@end 

@implementation TopUsersViewController 




- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [self readDataFromFile]; 

    [self.tableView reloadData]; 
} 


-(void)readDataFromFile 
{ 


    NSString *urlAsString = @"http://myURL.com/json.json"; 

    NSURL *url = [[NSURL alloc] initWithString:urlAsString]; 
    NSLog(@"%@", urlAsString); 

    [NSURLConnection sendAsynchronousRequest:[[NSURLRequest alloc] initWithURL:url] queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){ 

     if (error) 
     { 
      // no internet/can't fetch! 
      NSLog(@"Failure %@",error.localizedDescription); 


     } 


      NSLog(@"Success!"); 


      dispatch_async(dispatch_get_main_queue(), ^{ 
       NSLog(@"works."); 

      self.dataList = (NSArray *)[NSJSONSerialization JSONObjectWithData:data 
                 options:0 
                  error:nil]; 

      // this NSlog prints the JSON data successfully.  
      NSLog(@"oo%@ and array %@",_dataList,_array); 




      }); 
    }]; 







} 

// keine dieser Methoden ausgeführt werden ..

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 

    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    // count the initialized array from viewDidLoad 
    return self.dataList.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
     NSLog(@"return the data"); 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

    id keyValuePair = self.dataList[indexPath.row]; 


    cell.textLabel.text = keyValuePair[@"identity"]; 

    cell.detailTextLabel.text=[NSString stringWithFormat:@"Points: %@", keyValuePair[@"points"]]; 
    return cell; 
} 


@end 
+0

Ich werde andere Fragen beim nächsten Mal genauer überprüfen, danke, dass du darauf hingewiesen hast! Glückliche Kodierung! –

+0

@SyedeHussaini Sie müssen die Probleme in Ihrer Antwort wirklich beheben, wenn Sie andere darauf hinweisen wollen. – rmaddy

+0

Ihr Link war auch für Swift. Da meine aktuelle Anwendung in Obj-c geschrieben ist, ist sie nicht relevant. : P –

Antwort

0

Sie benötigen tableView von einem Delegierten Methode zu sagen, dass Sie möchten, dass Ihre Tableview neu zu laden, wenn Sie Daten in Ihrem Array haben ..

.
dispatch_async(dispatch_get_main_queue(), ^{ 
       NSLog(@"works."); 

      self.dataList = (NSArray *)[NSJSONSerialization JSONObjectWithData:data 
                 options:0 
                  error:nil]; 

      [self.tableView reloadData]; 
      // this NSlog prints the JSON data successfully.  
      NSLog(@"oo%@ and array %@",_dataList,_array); 




      }); 

Sie Ihre Tableview in viewDidLoad Methode Nachladen während an diesem Punkt Ihr Array kein Element hat, und wenn der Erfolg Block Ihrer api-Aufruf ausgeführt wird, dann müssen Sie r anrufen EloadData-Methode.

+0

Oh .. Nun, ich habe diese Methode in ViewDidLoad bereits? Glauben Sie, dass dies einen Unterschied machen wird? - (void) viewDidLoad { [super viewDidLoad]; [self readDataFromFile]; [self.tableView reloadData]; } –

+0

Nein, das wird diese Methode immer noch nicht ausführen. Weil Sie nicht wissen, wann der Erfolgsblock Ihrer API aufruft. Daher müssen Sie die Daten neu laden, wenn Ihr Array mit Daten geladen ist, also rufen Sie die reloadData-Methode unterhalb der Zeile auf, in der Sie das Array mit Daten laden. –

+0

Vielen Dank für die Überprüfung meines Falles. Es hat es gelöst! Fröhliche iOS Codierung! :) –