Панель поиска 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: и это сломало бы вашу реализацию).

Другие вопросы по тегам