Как отображать данные с помощью панели поиска и контроллера отображения поиска в другом контроллере представления

заранее спасибо.

Я пытаюсь создать приложение, в котором есть массивы с именами, изображениями и числами. У меня уже есть табличное представление со всеми данными в соответствующих массивах; У меня уже работает панель поиска и отображается правильный поиск. Чего мне не хватает, так это отображения результатов панели поиска в другом контроллере представления. (Я уже работал с табличным представлением: я выбираю имя, и оно открывает другое представление, а затем показывает мне изображение, номер и т. д.) Я просто пропускаю то же самое, но когда я выполняю поиск.

Вот мой код.

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

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

    if (tableView == self.tableView) {
       cell.textLabel.text = [Names objectAtIndex:indexPath.row];
        cell.imageView.image =[UIImage imageNamed:[Images objectAtIndex:indexPath.row]];
    } else{
        cell.textLabel.text = [searchResults objectAtIndex:indexPath.row];
    }
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    if (self.searchDisplayController.isActive) {
       [self performSegueWithIdentifier:@"ShowDreamsDetails" sender:self];
    }
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender  {
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
    if ([segue.identifier isEqualToString:@"ShowDreamsDetails"])  {
        NSString *object =nil;
        //  NSIndexPath *indexPath =nil;

        if (self.searchDisplayController.isActive) {
            indexPath =[[self.searchDisplayController searchResultsTableView] indexPathForSelectedRow];
            object = [searchResults objectAtIndex:indexPath.row];

            /* *Here is where I have the problem, If I leave it like thi,s it only shows         the first row in my array; I needed to send the correct name and details to the other View Controller.   */

            DesciptionViewController *desViewController = segue.destinationViewController;
            desViewController.PrincipalName = [Names objectAtIndex:indexPath.row ];
            desViewController.PrincipalDescription = [Description objectAtIndex:indexPath.row];
            desViewController.PrincipalNumber = [Numeros objectAtIndex:indexPath.row];
            desViewController.Images1 = [UIImage imageNamed: [Images objectAtIndex: indexPath.row]];  
        } else {
            DesciptionViewController *desViewController = segue.destinationViewController;
            desViewController.PrincipalName = [Names objectAtIndex:indexPath.row];
            desViewController.PrincipalDescription = [Description objectAtIndex:indexPath.row];
            desViewController.PrincipalNumber = [Numeros objectAtIndex:indexPath.row];
            desViewController.Images1 = [UIImage imageNamed: [Images objectAtIndex: indexPath.row]];

        }
    }
}

Заранее всем спасибо, и извините, если это дублирующийся вопрос; Я попытался поискать вокруг, но ничего не нашел.


person rog.computer5    schedule 14.03.2014    source источник


Ответы (1)


Из этого кода неясно, что хранится в вашем массиве searchResults. Обычно это объекты, представляющие принципала, которые имеют свойства Name, Description, Numeros и Image, но вы явно храните их в отдельных массивах.

Каким-то образом, когда вы выполняете поиск и отображаете результаты, вы получаете доступ к этим массивам; вам нужно воссоздать здесь то, что вы делали там. Другими словами, вы знаете, что у вас есть результат поиска #row, теперь вам нужно сопоставить его (я думаю, через searchResults) с правильной строкой в ​​ваших исходных массивах.

Другими словами, опубликуйте код для tableView:cellForRowAtIndexPath.

РЕДАКТИРОВАТЬ: после кода для cellForRowAtIndexPath: добавлено

Итак, у вас есть только имена в результатах поиска, а это значит, что вам нужно будет найти другие данные.

Опять же, было бы проще и лучше всего создать новый тип объекта Principal, который имеет свойства Name, Description, Numeros и Image, тогда ваш основной массив и ваши searchResults будут не строками, а Principals, и вы могли бы легко справиться с предоставлением соответствующую информацию для вашего контроллера представления. (На самом деле, ваш подчиненный контроллер представления может иметь свойство Principal *person, и вы можете просто назначить ему соответствующий Principal либо из вашего основного массива, либо из массива поиска.

Но... если вы хотите исправить это и заставить его работать, вы >можете‹ найти в массиве Names имя выбранного имени из searchResult. (Это предполагает, что нет двух людей с одинаковым именем, иначе он всегда найдет первое.)

Таким образом, ваш prepareForSegue изменяется на:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender  {
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
    if ([segue.identifier isEqualToString:@"ShowDreamsDetails"])  {
        NSInteger realRow = indexPath.row;
        if (self.searchDisplayController.isActive) {
            indexPath =[[self.searchDisplayController searchResultsTableView] indexPathForSelectedRow];
            NSString * name = (NSString *) [searchResults objectAtIndex:indexPath.row];
            realRow = [Names indexOfObject:name];
        }
        if (realRow != NSNotFound) {
            DesciptionViewController *desViewController = segue.destinationViewController;
            desViewController.PrincipalName = [Name objectAtIndex: row];
            desViewController.PrincipalDescription = [Description objectAtIndex: row];
            desViewController.PrincipalNumber = [Numeros objectAtIndex: row];
            desViewController.Images1 = [UIImage imageNamed: [Images objectAtIndex: row]];
        } else {
            NSLog(@"Well, this is very odd; an invalid indexPath or a name in searchResults that's not in Names");
        }
    }
}

Но опять же, было бы НАМНОГО лучше определить объект Principals и иметь его в двух ваших массивах.

person mackworth    schedule 14.03.2014
comment
Я разместил код, который вы просите для макворта. Спасибо - person rog.computer5; 15.03.2014
comment
Большое спасибо, MackWorth, ваше объяснение действительно помогло мне, единственное, что после того, как я попробовал его с кодом, который вы мне дали, я не работал с строкой в ​​​​конце, поэтому я попробовал это с реальной строкой, и это сработало. desViewController. PrincipalDescription = [Описание objectAtIndex: row ]; Спасибо . Я попытаюсь научиться с основной переменной, которую вы предложили, я видел примеры в Интернете, но не мог понять это хорошо. Спасибо. - person rog.computer5; 16.03.2014