Nano Hash - криптовалюты, майнинг, программирование

Как управлять несколькими массивами при использовании поиска в UITableView

У меня есть четыре массива videoName, ActorName, VideoID, ActorID. Я объединил имя видео и имя актера, чтобы создать единый массив «название», и то же самое с VideoID и идентификатором актера, чтобы создать массив «идентификаторов».

вот мой код,

Табличные методы

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        return self.searchResults.count;

    } else {
        return self.title.count;
    }
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellID = @"cellID";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];
    }
    cell.backgroundColor = [UIColor clearColor];
    cell.textLabel.textColor = [UIColor whiteColor];
    cell.imageView.frame = CGRectMake(0,0,32,32);
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        cell.textLabel.text = [self.searchResults objectAtIndex:indexPath.row];
        cell.imageView.image = [UIImage imageNamed:[img objectAtIndex:indexPath.row]];
        cell.textLabel.textColor = [UIColor blackColor];

    } else {
        cell.textLabel.text = [self.title objectAtIndex:indexPath.row];
        cell.imageView.image = [UIImage imageNamed:[img objectAtIndex:indexPath.row]];
    }
    return cell;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{ 
}

Методы поиска

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF beginswith[c] %@", searchText];
    //    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"contains[c] %@", searchText];
    self.searchResults = [self.title filteredArrayUsingPredicate:predicate];
}

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    [self filterContentForSearchText:searchString
                               scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
                                      objectAtIndex:[self.searchDisplayController.searchBar
                                                     selectedScopeButtonIndex]]];
    return YES;
}

Требование

Теперь, во-первых, мне нужно получить то, какая строка была выбрана, актер или видео, во-вторых, идентификатор актера или идентификатор видео. Это было легко, если не было панели поиска, потому что после поиска все строки снова восстанавливаются с новыми данными, плюс строки заполняются из «названия», а не «идентификаторов», поэтому как я могу получить идентификаторы, когда пользователь выбирает строку.



Ответы:


1

создайте подкласс NSObject для этих Item.h и Item.m с 3 свойствами для имени и идентификатора, например,

in Item.h

typedef enum : NSInteger {
    ItemTypeVideo,
    ItemTypeActor,
} ItemType;

@interface Item : NSObject 

@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *itemId;
@property (nonatomic, strong) NSString *imageName;
@property (nonatomic, assign) ItemType itemType;

@end

с помощью приведенного выше кода мы создаем класс, объект которого может содержать значения, определенные в свойствах.

поскольку объект класса Item может содержать имя, идентификатор, имя изображения и тип видео/актера, мы можем установить эти значения 1 видео/актера для одного объекта. здесь у нас есть несколько элементов видео/актера, поэтому нам нужен массив из Item объектов, каждый из которых содержит детали одного видео/актера, например

Item *videoItem = [[Item alloc] init];
videoItem.name = videoName;
videoItem.itemId = videoId;
videoItem.imageName = videoImageName;
videoItem.itemType = ItemTypeVideo;

создать для всех элементов массива videoName и массива актеров. Добавьте это к общему dataArray лайку,

[self.dataArray addObejct:videoItem];

а также

Item *actorItem = [[Item alloc] init];
actorItem.name = actorName;
actorItem.itemId = actorId;
actorItem.imageName = actorImageName;
actorItem.itemType = ItemTypeActor;

аналогично [self.dataArray addObejct:actorItem];

и в cellForRowAtIndexPath:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //other stuff
    Item *currentItem = nil;
    if (tableView == self.searchDisplayController.searchResultsTableView)    {
         currentItem = [self.searchResults objectAtIndex:indexPath.row];
    } else {
         currentItem = [self.dataArray objectAtIndex:indexPath.row];
    }

    cell.textLabel.text = currentItem.name;
    cell.imageView.image = [UIImage imageNamed:currentItem.imageName];

    //rest stuff
}

наконец в поиске,

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name beginswith[c] %@", searchText];
    //    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"contains[c] %@", searchText];
    self.searchResults = [self.dataArray filteredArrayUsingPredicate:predicate];
}

Так что в любом случае,

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{ 
        Item *currentItem = nil;
        if (tableView == self.searchDisplayController.searchResultsTableView)    {
             currentItem = [self.searchResults objectAtIndex:indexPath.row];
        } else {
             currentItem = [self.dataArray objectAtIndex:indexPath.row];
        }
        //all details will be in currentItem
}
23.07.2015
  • как я узнаю, это актер или видео? у меня уже есть массивы, заполненные через веб-сервисы, могу ли я просто добавить их в dataArray 23.07.2015
  • вы можете использовать перечисление или другое свойство, чтобы узнать актера/видео. см. обновленный ответ. 23.07.2015
  • @Akhilrajtr Могу ли я создать NSObject в том же классе? я не могу использовать его при создании того же класса... приложение падает. 23.07.2015
  • Как будто я добавил элемент интерфейса: NSObject, над интерфейсом людей () 23.07.2015
  • У меня возникли проблемы с NSObject, который вы создали первым... я новичок в ios... можете ли вы объяснить немного больше об этом 23.07.2015
  • я обновил некоторые пояснения, дайте мне знать, где вам трудно понять. 23.07.2015
  • Хорошо, есть раздел рабочих элементов, вы не упомянули numberOfRowsInSection, поскольку я использовал массив заголовков, а вы использовали там dataArray. 23.07.2015
  • поскольку мы используем dataArray в методе cellforRow, я думал, что это понятно. и я использовал другой массив dataArray, чтобы избежать путаницы с существующим массивом. поэтому используйте dataArray и в numberOfRows. 23.07.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..