Присоедините два NSMutableArrays и используйте с UISearchBar

#iphone #objective-c #ios #nsmutablearray #uisearchbar

#iPhone #objective-c #iOS #nsmutablearray #uisearchbar

Вопрос:

У меня есть два NSMutableArrays; name и NameID В моем tableview, только имя будет отображаться как textLabel.

Я хочу искать имена с помощью UISearchBar. Например;

    name   --    nameID
    Stack         123
    Over          -1
  

NameID — это главное, что нужно использовать.

Итак, возможно ли связать два NSMutableArrays, чтобы всякий раз, когда пользователи выбирают Stack, он показывал 123?

Спасибо

Ответ №1:

Как насчет использования одного NSMutableDictionary с именами в качестве ключей и идентификаторами в качестве значений?

Затем в вашей таблице массив данных можно найти с помощью [myNameDict allKeys] .

Или вы можете сделать идентификаторы ключами, а имена значениями, и в этом случае все имена будут доступны в виде массива при вызове [myNameDict allValues] .

Имейте в виду, что allKeys и allValues возвращают массивы, порядок которых не гарантируется.

Итак, вы могли бы, в качестве третьего варианта, поддерживать массив словарей, где каждый словарь имеет два ключа, name и id, значениями которых являются name и id. Затем вы объединили каждое имя и идентификатор в один объект (словарь) и можете быть уверены в порядке следования вашего массива пар имя / идентификатор.

Ответ №2:

Один из подходов может быть таким: вместо того, чтобы хранить данные отдельно, поскольку они имеют взаимосвязь, вы можете инкапсулировать их, скажем, в класс, Record который имеет два поля name и id . Теперь удерживайте массив этого объекта (скажем recordList ).

Когда мы сможем выполнить поиск любого Record с заданным searchText значением следующим образом.

 -(Record *) searchRecordWithName:(NSString *)searchText
{
Record *tempRecord;
  for( tempRecord in recordList)
  {
    NSRange searchRange = [tempRecord.name rangeOfString:searchText options:NSCaseInsensitiveSearch];
     if( searchRange.length>0 amp;amp; searchRange.location==0)
      {
         break;
      }
  }
return tempRecord;
}
  

Пожалуйста, исправьте приведенный выше код в соответствии с вашими потребностями. Здесь я думаю, что вы хотите найти NameID для того, чтобы record имя начиналось с searchText (как вы видите, я использовал searchRange.location ==0`).

Предположим, в будущем вам нужно хранить больше деталей для записи, чем это будет проще.

Ответ №3:

Один из найденных мной простых способов заключается в том, чтобы соединить строки (name #NameID) и после этого разделить, чтобы получить обратно NameID.