Функциональные возможности
В противном случае экран будет заполнен заголовками и пустыми разделами, и это будет выглядеть не хорошо. Мы индексировать нечто несуществующее, так что, так же, как мы отбраковываем имена на основании критерия поиска, отбраковываем и пустые разделы.
Несмотря на то что мы начнем поиск с методов делегата полосы поиска, мы оформили метод handleSearchForTerm: в виде отдельного метода, поскольку намерены использовать эту функциональную возможность в двух различных методах делегата. Встраивая поиск в метод handleSearchForTerm:, мы собираем функциональные возможности в одном месте, что упрощает их поддержку, а затем просто вызываем этот новый метод по мере необходимости.
Так как основная работа сосредоточена именно здесь, разберем этот метод на более мелкие части.
Во-первых, создаем массив, который будет хранить найденные пустые разделы. Мы будем использовать этот массив для удаления этих пустых разделов позже, потому что не безопасно удалять объекты из коллекции во время ее итерирования. Так как мы используем быстрое перечисление, попытка поступить таким образом вызовет исключение. Потому, поскольку мы не в состоянии удалять ключи в процессе итераций, сохраняем разделы, которые должны быть удалены, в массиве, и после завершения перечисления удаляем все объекты сразу. После выделения массива сбрасываем поиск.
При каждом проходе цикла мы получаем массив имен, соответствующих текущему ключу, и создаем еще один массив для хранения значений, которые следует удалить из массива имен. Помните, что мы удаляем имена и разделы, поэтому должны отслеживать, какие ключи пусты, так же как и имена, которые не соответствуют критериям поиска.
Затем перебираем все имена в текущем массиве. Таким образом, если мы работаем в данный момент с ключом А, этот цикл будет проходить по всем именам, начинающимся с А.
В этом цикле мы используем один из методов NSStrinq, который возвращает расположение подстроки в строке. Мы указываем опцию NSCaselnsensitiveSearch, чтобы указать, что при поиске регистр букв не учитывается — другими словами, А и а рассматриваются как одна и та же буква. Значение, возвращаемое этим методом, — структура NSRange с двумя членами: location и length. Если искомое слово не найдено, то значение location будет установлено равным NSNotFound, поэтому мы должны проверить это значение. Если возвращается NSRange, который содержит NSNotFound, добавляем имя в массив объектов, которые будут удалены позже.
- Дата: 3-12-2014, 20:58