2017-03-22 2 views
0

Ich benutze Tabellenansicht mit Suchleiste, json wird korrekt vom Server abgerufen. Aber die Daten werden nicht in meiner Tabellenansicht geladen, wenn ich den Viewcontroller zum ersten Mal öffne, aber wenn ich etwas in meine Suchleiste eintippe, sind Daten sichtbar und werden gefiltert und dann in meiner Tabellenansicht richtig angezeigt. kann mir jemand sagen, was könnte hier probleme sein? Ich möchte Tabellenansicht laden gesamte JSON-Daten, wenn es erste Zeit geöffnet ist.Tabellenansicht wird nicht geladen, wenn Viewcontroller zum ersten Mal geladen wird

hier ist mein 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]; 

} 

Antwort

0

Setzen [self.residentListTableView reloadData]; innerhalb NSURLSession completionHandler Block. Ihre aktuelle Logik ist falsch, weil Daten nicht geladen werden, wenn Sie [self.residentListTableView reloadData]; aufrufen. Der NSURLSession-Task wurde asynchron ausgeführt. Wenn Sie [self.residentListTableView reloadData]; aufrufen, sind die Daten nicht verfügbar.

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

Vielen Dank für die Antwort @nynohu. Ich habe den Code unten gelöst. – Shelby

0

müssen Sie [self.residentListTableView reloadData]; in Ihrem Abschluss Block (dh vor der schließenden Klammer folgende NSLog(@"GGGGGGGGHHHHHHHH:%@",productArray);.

Was geschieht hier wird der Block asynchron ausgeführt wird (auch bekannt als später, wenn es bekommt eine Antwort vom Server) Sie können dies überprüfen, indem Sie einen Breakpoint im Completion-Block und einen nach dem Completion-Block setzen.Wenn Sie den Code ausführen, sehen Sie, dass der Breakpoint nach dem Block vor dem Block angeklickt wird, und das heißt, Sie sind ruft derzeit [self.residentListTableView reloadData] auf, bevor Sie die Daten vom Server zurückbekommen haben

eine weitere Sache. Der Block ist auch wahrscheinlich, auf einem Hintergrund-Thread ausgeführt wird, so ist es sinnvoll, diese reload Anruf auf dem Haupt-Thread zu setzen, weil es UI aktualisiert, wie so ...

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

Danke, dass es funktioniert – Shelby

+0

können Sie mir sagen, wie Sie die Fortschrittsbalken hier einstellen und nach dem Laden der Daten ablehnen. – Shelby

+0

Ich habe es mit HUD gemacht – Shelby

0

Dank @TMin und @nylohu, Das hat für mich funktioniert.

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

Auch, da es Blöcke gibt, sollten Sie wahrscheinlich einen schwachen Selbst/starken Tanz machen. [link] (https://dhoerl.wordpress.com/2013/04/23/i-finally-figured-out-weakself-and-strongself/) -> –

Verwandte Themen