2014-12-03 111 views
0

我正在嘗試創建一個搜索欄,它將用來自兩個數據源(本地& API調用)的結果更新UITableView。我正在努力找出實現這一點的正確方法。filterContentForSearchText不在UITableView上顯示數據

我有一個UITableView設置爲頂部有搜索欄的用戶列表。

enter image description here

當我有設置爲與本地SEARCHTEXT過濾UITableCells代碼它完美。

enter image description here

然而,從解析拉動數據,並試圖加入,在細胞下方的本地搜索數據時沒有出現。

enter image description here

的代碼正確地更新self.searchText陣列但數據在的tableView從不顯示。是什麼賦予了?

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
{ 
    [self.searchResult removeAllObjects]; 
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText]; 

    NSMutableArray *queryArray = [[NSMutableArray alloc] init]; 
    PFQuery *query = [PFUser query]; 
    [query whereKey:@"fullName" hasPrefix:@"Joe"]; 
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
    if (!error) { 
     for (PFObject *pfObj in objects) 
     { 
      NSDictionary *person = [[NSDictionary alloc] 
            initWithObjects:@[pfObj[@"fullName"], pfObj.objectId] 
            forKeys:@[@"name", @"objectId"]]; 
      [queryArray addObject:person]; 
     } 

     self.searchResult = [NSMutableArray arrayWithArray: [self.contacts filteredArrayUsingPredicate:resultPredicate]]; 
     [self.searchResult addObjectsFromArray:queryArray]; 
    } else { 
     NSLog(@"%@", error); 
    } 
}];  
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 

    if (tableView == self.searchDisplayController.searchResultsTableView) 
    { 
     cell.textLabel.text = [self.searchResult[indexPath.row] objectForKey:@"name"]; 
    } 
    else 
    { 
     cell.textLabel.text = [self.contacts[indexPath.row] objectForKey:@"name"]; 
    } 

    return cell; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if (tableView == self.searchDisplayController.searchResultsTableView) 
    { 
     return [self.searchResult count]; 
    } 
    else 
    { 
     return [self.contacts count]; 
    } 
} 
+0

您是否實施了多少次浮動?在此處發佈 – Pawan 2014-12-03 06:38:44

+0

在完成從分析中加載數據後,您需要重新加載tableView。確保你在主隊列上執行此操作 – Paulw11 2014-12-03 06:43:45

+0

@pawan是的,我已經實現了numberOfRowsInSection。我已經相應地更新了我的帖子。 – 2014-12-03 17:15:20

回答

1

也許你從服務器獲取數據,這樣,當它調用方法

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 

重新加載與當前陣列self.searchResult,它現在已經沒有值的表。所以,我認爲你應該重新加載搜索表中的數據是從是

if (!error) { 
     for (PFObject *pfObj in objects) 
     { 
      NSDictionary *person = [[NSDictionary alloc] 
            initWithObjects:@[pfObj[@"fullName"], pfObj.objectId] 
            forKeys:@[@"name", @"objectId"]]; 
      [queryArray addObject:person]; 
     } 

     self.searchResult = [NSMutableArray arrayWithArray: [self.contacts filteredArrayUsingPredicate:resultPredicate]]; 
     [self.searchResult addObjectsFromArray:queryArray]; 
[self.searchDisplayController.searchResultsTableView reloadData]; 
    } else { 
     NSLog(@"%@", error); 
    } 

而且據我來說,最好的辦法是首先應該顯示本地結果服務器檢索之後 - 直到的休息聯繫人從Parse加載,也就是說。

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
{ 
    [self.searchResult removeAllObjects]; 
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText]; 
    self.searchResult = [NSMutableArray arrayWithArray: [self.contacts filteredArrayUsingPredicate:resultPredicate]]; 

    NSMutableArray *queryArray = [[NSMutableArray alloc] init]; 
    PFQuery *query = [PFUser query]; 
    [query whereKey:@"fullName" hasPrefix:@"Joe"]; 
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
    if (!error) { 
     for (PFObject *pfObj in objects) 
     { 
      NSDictionary *person = [[NSDictionary alloc] 
            initWithObjects:@[pfObj[@"fullName"], pfObj.objectId] 
            forKeys:@[@"name", @"objectId"]]; 
      [queryArray addObject:person]; 
     } 
     [self.searchResult addObjectsFromArray:queryArray]; 
     self.searchDisplayController.searchResultsTableView reloadData]; 
    } else { 
     NSLog(@"%@", error); 
    } 
}];  
} 
+0

它的工作原理!感謝您的幫助! – 2014-12-03 17:24:17