简体   繁体   中英

Tableview not loading when viewcontroller is loaded for the first time

I am Using tableview with searchbar, json is fetching properly from server. but data is not loading in my tableview when I open viewcontroller for the fist time, however when I type somthing in my searchbar data is visible and it is getting filtered, and then shown properly in my tableview. can anyone tell me whatcould be issues here? I want tableview to load entire json data when it is open fist time.

here is my code

    - (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

     [self customizeUI];

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

    isFiltered = NO;

    self.residentSerachBar.delegate = self;
    self.residentListTableView.delegate = self;
    self.residentListTableView.dataSource = self;

    filterdArray = [NSMutableArray new];
    productArray = [NSMutableArray new];

    NSURL *url = [NSURL URLWithString: @"XXXXX.json"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    [request setHTTPMethod:@"GET"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

    NSString *authStr = [NSString stringWithFormat:@"%@:%@",savedUsername, savedPassword];
    NSData *authData = [authStr dataUsingEncoding:NSUTF8StringEncoding];
    NSString *authValue = [NSString stringWithFormat:@"Basic %@", [authData base64EncodedStringWithOptions:0]];
    [request setValue:authValue forHTTPHeaderField:@"Authorization"];

    NSURLSession *session = [NSURLSession sharedSession];
    [[session dataTaskWithRequest:request
                completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
                    if (!error) {
                        NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

                        productArray = [responseDictionary objectForKey:@"seniors"];

                         NSLog(@"GGGGGGGGHHHHHHHH:%@",productArray);
                    }
                }] resume];

    [self.residentListTableView reloadData];
}

    - (void)customizeUI {
    self.view.backgroundColor = [UIColor clearColor];
    self.baseResidentView.backgroundColor = [UIColor menyouSeniorsPopOverBackgroundColor];
    self.baseResidentView.layer.borderColor = [UIColor menyouKitchenLightGrayBorderColor].CGColor;
    self.baseResidentView.layer.borderWidth = 2.0f;


}

    -(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{


    NSLog(@"HIIIIIIII");

    self.lableSelectResident.text = @"";

    if(searchText.length == 0){

        isFiltered = NO;
    }else{



      isFiltered = YES;

              [filterdArray removeAllObjects];
        for(int i = 0; i < [productArray count]; i++){
            NSRange textRange;
            textRange =[[[[productArray objectAtIndex:i] objectForKey:@"senior_name"] lowercaseString] rangeOfString:searchText options:NSCaseInsensitiveSearch];
            //I wasn't sure which objectForKey: string you were looking for, just replace the one you want to filter.
            if(textRange.location != NSNotFound)
            {

                [filterdArray addObject:[productArray objectAtIndex:i]];

                 NSLog(@"filterdArrayyyyyyyy:%@",filterdArray);

            }
        }            
    }

    [self.residentListTableView reloadData];
}

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

    return 1;

}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

    if(isFiltered){

        return [filterdArray count];

    }

    return [productArray count];

}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

     NSLog(@"LLLLLLLLLLLLLLL");

    static NSString *cellIdentifier = @"ResidentListTableViewCell";

     ResidentListTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];


    if(!cell){

        // cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        cell = [[ResidentListTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];

    }

     if(!isFiltered){

    NSDictionary *productDictionary = [productArray objectAtIndex:indexPath.row];
         cell.residentNameLabel.text = [productDictionary objectForKey:@"senior_name"];

         if([productDictionary objectForKey:@"room_no"] == [NSNull null]){
             NSLog(@"CCCCCCC222222");
             cell.residentRoomIdLabel.text = @"";

         }else{
             int room_no = [[productDictionary objectForKey:@"room_no"] intValue];
             cell.residentRoomIdLabel.text = [NSString stringWithFormat:@"%d", room_no];;
         }

         int rId = [[productDictionary objectForKey:@"id"] intValue];
         cell.residentIdLabel.text = [NSString stringWithFormat:@"%d", rId];             
     }

     else{

          NSDictionary *productDictionary = [filterdArray objectAtIndex:indexPath.row];

         cell.residentNameLabel.text = [productDictionary objectForKey:@"senior_name"];

         if([productDictionary objectForKey:@"room_no"] == [NSNull null]){
             NSLog(@"CCCCCCC222222");
             cell.residentRoomIdLabel.text = @"";

         }else{
             int room_no = [[productDictionary objectForKey:@"room_no"] intValue];
             cell.residentRoomIdLabel.text = [NSString stringWithFormat:@"%d", room_no];;
         }

         int rId = [[productDictionary objectForKey:@"id"] intValue];
         cell.residentIdLabel.text = [NSString stringWithFormat:@"%d", rId];
     }

          return  cell;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

       ResidentListTableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    self.lableSelectResident.text =  cell.residentNameLabel.text;

    self.residentId = cell.residentIdLabel.text;
     self.residentRoomNo = cell.residentRoomIdLabel.text;

    self.residentSerachBar.text = cell.residentNameLabel.text;

    [self.view endEditing:YES];

}

Put [self.residentListTableView reloadData]; inside NSURLSession completionHandler block. Your current logic is wrong because of data is not loaded when you call [self.residentListTableView reloadData]; . The NSURLSession task executed asynchronous and when you call [self.residentListTableView reloadData]; , the data is not available.

NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithRequest:request
            completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
                if (!error) {
                    NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
                    productArray = [responseDictionary objectForKey:@"seniors"];
                     NSLog(@"GGGGGGGGHHHHHHHH:%@",productArray);
                }
            }] resume];

you need to [self.residentListTableView reloadData]; in your completion block (ie before the closing brace following NSLog(@"GGGGGGGGHHHHHHHH:%@",productArray); .

What's happening here is the block is executing asynchronously (AKA later when it gets a response back from the server). You can check this by putting a breakpoint in the completion block and one after the completion block. When you run the code you'll see that the breakpoint after the block gets hit before the one in the block, and that means that you are currently calling [self.residentListTableView reloadData] before you've got the data back from the server.

one more thing. The block is also, likely, being executed on a background thread, so it is good practice to put this reloadData call on the main thread because it is updating UI, like so...

dispatch_async(dispatch_get_main_queue(),
^{
   [self.residentListTableView reloadData];
});

Thanks @TMin and @nylohu, This worked for me.

 NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithRequest:request
            completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
                if (!error) {
                    NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];


                    productArray = [responseDictionary objectForKey:@"seniors"];


                    dispatch_async(dispatch_get_main_queue(),
                                   ^{
                                       [self.residentListTableView reloadData];
                                   });



                }
            }
  ] resume];

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM