2016-08-05 7 views
0

Ich habe eine Tabellenansicht in einem UIViewController und ich lade die Daten aus einer Datenbank. Aber wenn ich die App starte, ist der Tisch leer. Erst wenn ich auf den Tisch klicke, erscheinen die Daten. Kann mir jemand sagen, was ich ändern muss? Hier ist mein Code:Objective-C: TableView in UIViewController - Daten werden nur nach einem Klick geladen

#import "DashboardViewController.h" 
#import <UIKit/UIKit.h> 

@interface DashboardViewController() 

@property (strong, nonatomic) IBOutlet UITableView *tableView; 
@property (strong, nonatomic) NSMutableArray *data; 

@end 

@implementation DashboardViewController 


- (void)viewDidLoad { 
    [super viewDidLoad]; 

} 

-(void)viewWillAppear:(BOOL)animated{ 
    [self data]; // ??? 
} 

- (NSMutableArray *)data { 

    if(!_data){ 

     _data = [[NSMutableArray alloc] init]; 

     NSString *username = [[NSUserDefaults standardUserDefaults] stringForKey:@"username"]; 

     NSURLSession *session = [NSURLSession sharedSession]; 
     NSString *url = [NSString stringWithFormat:@"http://www.example.net/getData.php?user=%@", username]; 
     NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:url] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error){ 

      NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 
      NSString *errorCode = [json valueForKey:@"error"]; 

      if([errorCode isEqualToString:@"e0"]){ 

       NSArray *myData = [json objectForKey:@"myData"]; 

       for (int i = 0; i < [myData count]; i++) { 
        [_data addObject:[myData objectAtIndex:i]]; 
        [self.tableView reloadData]; 
       } 

      } 

     }]; 

     [dataTask resume]; 

    } 

    return _data; 

} 

#pragma mark - Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return [self.data count]; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath]; 

    cell.textLabel.text = [[self.data objectAtIndex:indexPath.row] objectForKey:@"name"]; 

    return cell; 
} 

@end 
+0

nur schreiben [self.tableView reload]; aus Ihrer Schleife und wenn Bedingung. –

Antwort

1

nicht wie

for (int i = 0; i < [myData count]; i++) { 
       [_data addObject:[myData objectAtIndex:i]]; 
       [self.tableView reloadData]; 
      } 

tun wie

for (int i = 0; i < [myData count]; i++) { 
       [_data addObject:[myData objectAtIndex:i]]; 

      } 

      if (_data.count>0) 
     { 
     dispatch_async(dispatch_get_main_queue(), ^(void){ 
     //Run UI Updates 
      [self.tableView reloadData]; 
     }); 
     } 
+0

Sie müssen Ihre Benutzeroberfläche für Hauptthread nehmen, der Grund, warum Sie den anderen Thread in main 'dataTaskWithURL hinzugefügt, so dass, wenn wir' dispatch_get_main_queue' verwenden, es automatisch die Liste –

+0

Ty gefüllt. Noch eine Frage: Ich habe einen Knopf auf dieser Ansicht mit einem Push-Segment. Wenn ich auf diese Schaltfläche klicke und dann die Zurück-Schaltfläche verwende, wie kann ich die Daten der Tabellenansicht erneut laden? Ich meine, es sollte die Daten wieder aus der Datenbank laden. Weißt du, dass? – Nono

+0

rufen Sie Ihre Daten laden Methode in ViewWillAppear –

Verwandte Themen