我正在使用带有搜索栏的tableview,json正在从服务器中正确获取。但是当我第一次打开viewcontroller时,数据没有加载到我的tableview中,但是当我在我的搜索栏中输入somthing时,数据是可见的并且它被过滤,然后在我的tableview中正确显示。 谁能告诉我这里可能出现什么问题? 我希望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];
}
答案 0 :(得分:0)
将[self.residentListTableView reloadData];
置于NSURLSession completionHandler
块内。您当前的逻辑是错误的,因为在您调用[self.residentListTableView reloadData];
时未加载数据。 NSURLSession任务是异步执行的,当您调用[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];
答案 1 :(得分:0)
你需要在完成块中[self.residentListTableView reloadData];
(即在NSLog(@"GGGGGGGGHHHHHHHH:%@",productArray);
之后的右大括号之前。
这里发生的事情是块正在异步执行(AKA稍后会从服务器获得响应)。您可以通过在完成块中放置一个断点并在完成块之后放置一个断点来检查这一点。当您运行代码时,您将看到块之后的断点在块中的断点之前被触发,这意味着您在从服务器获取数据之前正在调用[self.residentListTableView reloadData]
。
dispatch_async(dispatch_get_main_queue(),
^{
[self.residentListTableView reloadData];
});
答案 2 :(得分:0)
谢谢@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];