繁体   English   中英

首次加载ViewController时未加载Tableview

[英]Tableview not loading when viewcontroller is loaded for the first time

我正在将tableview与searchbar一起使用,json正在从服务器正确获取。 但是当我第一次打开viewcontroller时,数据没有加载到我的表视图中,但是当我在搜索栏中键入东西时,数据是可见的并且已被过滤,然后在我的表视图中正确显示。 谁能告诉我这里可能有什么问题? 我希望tableview在打开时间时加载整个json数据。

这是我的代码

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

}

[self.residentListTableView reloadData]; NSURLSession completionHandler块中。 您当前的逻辑是错误的,因为调用[self.residentListTableView reloadData];时未加载数据[self.residentListTableView reloadData]; NSURLSession任务以异步方式执行,并且在您调用[self.residentListTableView reloadData];时执行[self.residentListTableView reloadData]; ,数据不可用。

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]; 在您的完成代码块中(即NSLog(@"GGGGGGGGHHHHHHHH:%@",productArray);之后的NSLog(@"GGGGGGGGHHHHHHHH:%@",productArray);括号之前NSLog(@"GGGGGGGGHHHHHHHH:%@",productArray);

这里发生的是该块异步执行(又是稍后从服务器返回响应时又执行)。 您可以通过在完成块中放置一个断点,并在完成块之后放置一个断点来进行检查。 运行代码时,您会看到该块后的断点在该块中的断点之前被命中,这意味着您当前正在调用[self.residentListTableView reloadData]然后再从服务器取回数据。

还有一件事。 该块也可能在后台线程上执行,因此,最好将这个reloadData调用放在主线程上,因为它正在更新UI,就像这样...

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

感谢@TMin和@nylohu,这对我有用。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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