Панель поиска iOS не будет ссылаться на правильные результаты
Всякий раз, когда я ищу что-то из панели поиска, я получаю правильные результаты. Когда я нажимаю на эти результаты, он связывает меня с тем же местом, с которым исходные результаты связали бы меня. Другими словами, у меня есть учитель ae, я набираю "e" и получаю только результат "e", но когда я нажимаю на эту ячейку, он связывает меня с профилем "a" учителя. Вот что у меня так далеко.
#import <UIKit/UIKit.h>
@interface ListTableViewController : UITableViewController
@end
---
#import "ListTableViewController.h"
#import "DetailsViewController.h"
@interface ListTableViewController () <UISearchDisplayDelegate>
@property (strong, nonatomic) NSArray *className;
@property (strong, nonatomic) NSArray *teacherName;
@property (strong, nonatomic) NSArray *blockNumber;
@property (strong, nonatomic) NSArray *myNew;
@property (strong, nonatomic) NSArray *searchResults;
@end
@implementation ListTableViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.className = [NSArray arrayWithObjects:@"Biology",@"English III",@"Chemistry",@"Algebra II",@"Morality", nil];
self.teacherName = [NSArray arrayWithObjects:@"Teacher A",@"Teacher B",@"Teacher C",@"Teacher D",@"Teacher E", nil];
self.blockNumber = [NSArray arrayWithObjects:@"B1",@"B3",@"B6",@"B2",@"B1", nil];
NSMutableArray *combinedArray = [[NSMutableArray alloc]init];
for (int i = 0; i < [self.className count]; i++)
{
NSString *combinedString = [NSString stringWithFormat:@"%@ | %@ | %@",[self.className objectAtIndex:i],[self.teacherName objectAtIndex:i],[self. blockNumber objectAtIndex:i]];
[combinedArray addObject:combinedString];
}
self.myNew = combinedArray;
}
- (void)filterContentForSearchText: (NSString *) searchText
{
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", searchText];
self.searchResults = [self.myNew filteredArrayUsingPredicate:resultPredicate];
}
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
[self filterContentForSearchText:searchString];
return YES;
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (tableView == self.tableView) {
return [self.myNew count];
} else { // (tableView == self.searchDisplayController.searchResultsTableView)
return [self.searchResults count];
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
if (tableView == self.tableView) {
cell.textLabel.text = [self.myNew objectAtIndex:indexPath.row];
} else {
cell.textLabel.text = [self.searchResults objectAtIndex:indexPath.row];
}
return cell;
}
#pragma mark - Table view delegate
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"showDetails"]) {
DetailsViewController *dvc = segue.destinationViewController;
NSIndexPath *indexPath = nil;
if ([self.searchDisplayController isActive]) {
indexPath = [self.searchDisplayController.searchResultsTableView indexPathForSelectedRow];
dvc.sendLabel = [self.searchResults objectAtIndex:indexPath.row];
dvc.teachersendLabel = [self.teacherName objectAtIndex:indexPath.row];
return;
} else{
indexPath = [self.tableView indexPathForSelectedRow];
dvc.sendLabel = [self.myNew objectAtIndex:indexPath.row];
dvc.teachersendLabel = [self.teacherName objectAtIndex:indexPath.row];
return;
}
}
}
@end
В моем DetailsViewController
#import <UIKit/UIKit.h>
@interface DetailsViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *label;
@property (strong, nonatomic) NSString *sendLabel;
@property (weak, nonatomic) IBOutlet UILabel *teacherlabel;
@property (strong, nonatomic) NSString *teachersendLabel;
@end
---
@implementation DetailsViewController
@synthesize label;
- (void)viewDidLoad
{
[super viewDidLoad];
self.teacherlabel.text = [NSString stringWithFormat:@"%@", self.teachersendLabel];
self.label.text = [NSString stringWithFormat:@"%@", self.sendLabel];
}
@end
1 ответ
Глядя на ваш код, не было бы никаких проблем. Есть только две вещи, о которых я могу думать:
1) Я не уверен, как вы отображаете "основной" tableView и результаты поиска один. Может быть, ваши прикосновения на самом деле обрабатываются "основным" tableView? Это может произойти, если две таблицы выровнены друг над другом, а нижняя таблица все еще видна, а для userInteractionEnabled задано значение YES, когда поиск выполняется по принципу "isActive". В этом случае иерархия представления должна выглядеть примерно так:
- UIView
- UITableView (main)
- UITableView (search)
2) использование -[UITableView indexPathForSelectedRow]
в prepareForSegue:sender:
, Если вы используете раскадровку, отправителем будет выбранная ячейка. Вы можете проверить, что отправитель является действительной ячейкой или indexPath isKindOfClass
, Если отправителем является indexPath, вы можете использовать его, если это ячейка, вы можете вызвать метод -[UITableView indexPathForCell:]
, Используя этот подход, вы гарантируете, что ваша очередь действительно запускается для правильного события (например, вы можете программно выбрать ячейку, но это не вызовет передачу, и вы можете позже решить вызвать -performSegueWithIdentifier:sender:
и это сломало бы вашу реализацию).