2014-01-22 173 views
2

我有一個tableview加載一個名爲self.annotationToSort的數組,並使用UISearchBar在tableview中搜索對象並更新結果。如果選擇了tableview中的項目,則會顯示一個詳細視圖以及相應的索引路徑信息。爲什麼UISearchBar tableview索引路徑總是返回objectAtIndex:0

我遇到的問題是,當使用搜索欄時,我在搜索中得到2個結果項,單元格中的值顯示正確,但然後我點擊結果B,我得到對象A傳遞給詳細視圖控制器。如果我點擊一個,我也得到A.

下面是相關代碼:

#pragma mark - Table view data source 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ 
    return 1; 
} 

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

#pragma mark Content Filtering 
-(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope { 
    [self.filteredResultsArray removeAllObjects]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SELF.name contains[c] %@) OR (SELF.ciudad contains[c] %@)", searchText,searchText]; 
    [self.filteredResultsArray = [NSMutableArray arrayWithArray:[self.annotationsToSort filteredArrayUsingPredicate:predicate]] retain]; 
} 

#pragma mark - UISearchDisplayController Delegate Methods 
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { 
    [self filterContentForSearchText:searchString scope: 
    [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]]; 
    tableType = @"FILTER"; 
    return YES; 
} 

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption { 
    [self filterContentForSearchText:self.searchDisplayController.searchBar.text scope: 
    [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]]; 
    return YES; 
} 


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 
    NSIndexPath *indexPath = [self.tableView indexPathForCell:sender]; 
    NSLog(@"indexpath selected %@", indexPath); 

    //Check if using normal or search array 
    if ([tableType isEqualToString:@"FILTER"]) { 
     MyLocation *sendingLocation = [self.filteredResultsArray objectAtIndex:indexPath.row]; 
     DetailViewController *destinationViewController = segue.destinationViewController; 
     destinationViewController.receivedLocation = sendingLocation; 
     NSLog(@"indexpath selected filter %@", indexPath); 
    } else { 
     MyLocation *sendingLocation = [self.annotationsToSort objectAtIndex:indexPath.row]; 
     DetailViewController *destinationViewController = segue.destinationViewController; 
     destinationViewController.receivedLocation = sendingLocation; 
     NSLog(@"indexpath selected regular %@", indexPath); 
    } 
} 

我可以看到被記錄的索引路徑爲空正在過濾的tableview時。它總是返回objectAtIndex:0。

+0

什麼'NSLog(@「indexpath選擇%@」,indexPath);'輸出? – Wain

+0

@我只是編輯了我的問題。在過濾器模式下,它將記錄爲空!但是tableview仍然顯示所有正確過濾的結果。 – marciokoko

+0

神聖的巢嵌套蝙蝠俠。只要我遇到一個我不明白的問題,第一步(當然是在向StackOverflow發佈問題之前)將代碼重寫爲可讀的內容。 – nhgrif

回答

3

你不應該這樣做NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];,因爲有時你會問錯誤的表視圖,它會返回nil(當訪問結果的行號爲零時)。

取而代之,請檢查您是否被過濾併爲索引詢問適當的表視圖。

+0

那麼這不就是if/else在做什麼?我檢查過濾器,它的工作原理是因爲我輸入了第一個if-block。它使用結果和自從在過濾器中的Im記錄數組,我使用self.filteredResultsArray而不是使用其他數組。我不瞭解什麼? thx – marciokoko

+0

您需要從相應的表格中獲取if中的索引路徑。 – Wain

+0

好吧,一定是我想念的東西。我只是將索引路徑getter移動到每個if塊中,但我只有一個tableview。是不是隻是在同一個tableview中更新數據? – marciokoko

相關問題