2016-08-05 3 views
0

У меня есть представление таблицы в UIViewController и я загружаю данные из базы данных. Но когда я запускаю приложение, таблица пуста. Только когда я нажимаю на таблицу, будут отображаться данные. Может ли кто-нибудь сказать мне, что я должен изменить? Вот мой код:Objective-C: TableView в UIViewController - данные просто загружаются после нажатия

#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

просто написать [self.tableView reloadData]; из вашего цикла и если условие. –

ответ

1

не нравится

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

сделать как

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

вам нужно взять свой пользовательский интерфейс для основного потока, потому что вы добавили другой поток в основной 'dataTaskWithURL, поэтому, если мы будем использовать' dispatch_get_main_queue', он автоматически заполняет список –

+0

Ty. Еще один вопрос: у меня есть кнопка на этом представлении с помощью push segue. Когда я нажимаю на эту кнопку, а затем использую кнопку «Назад», как я могу перезагрузить данные в виде таблицы? Я имею в виду, что он должен снова загружать данные из базы данных. Вы это знаете? – Nono

+0

вызов метода загрузки данных в ViewWillAppear –

Смежные вопросы