Чтение онлайн

ЖАНРЫ

iOS. Приемы программирования

Нахавандипур Вандад

Шрифт:

}

[self.dictionaryOfNumbers removeObjectForKey: key];

/* Затем удаляем раздел из табличного вида. */

NSIndexSet *sectionToDelete = [NSIndexSet indexSetWithIndex: indexForKey];

[self.tableViewNumbers deleteSections: sectionToDelete

withRowAnimation: UITableViewRowAnimationAutomatic];

/* Наконец, убираем с навигационной панели кнопку,

так как она нам больше не понадобится. */

[self.navigationItem setRightBarButtonItem: nil animated: YES];

}

Все

довольно просто. Теперь, когда пользователь нажмет кнопку на навигационной панели, раздел Odd Numbers (Нечетные числа) исчезнет из табличного вида. Как видите, в процессе удаления раздела табличный вид анимируется. Это происходит потому, что мы передали анимационный тип UITableViewRowAnimationAutomatic параметру withRowAnimation: метода deleteSections: withRowAnimation: табличного вида. Теперь запустите приложение в эмуляторе iOS и выполните Debug — Toggle Slow Animations (Отладка — Включить медленную анимацию). Потом попробуйте нажать кнопку на навигационной панели и посмотрите, что происходит. Как видите, удаление сопровождается медленной анимацией (движением). Красиво, правда? Когда удаление завершится, приложение будет выглядеть, как на рис. 4.16.

Рис. 4.16. Раздел, содержащий нечетные числа, удален из табличного вида

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

— (void)viewDidLoad {

[super viewDidLoad];

self.barButtonAction =

[[UIBarButtonItem alloc]

initWithTitle:@"Delete Numbers > 2"

style: UIBarButtonItemStylePlain

target: self

action:@selector(deleteNumbersGreaterThan2:)];

[self.navigationItem setRightBarButtonItem: self.barButtonAction

animated: NO];

self.tableViewNumbers = [[UITableView alloc]

initWithFrame: self.view.frame

style: UITableViewStyleGrouped];

self.tableViewNumbers.autoresizingMask =

UIViewAutoresizingFlexibleWidth |

UIViewAutoresizingFlexibleHeight;

self.tableViewNumbers.delegate = self;

self.tableViewNumbers.dataSource = self;

[self.view addSubview: self.tableViewNumbers];

}

На рис. 4.17 показано, как выглядит приложение при запуске в эмуляторе iPhone.

Рис. 4.17. Кнопка, удаляющая все ячейки с числами больше 2

Теперь кнопка навигационной

панели связана с селектором deleteNumbersGreaterThan2:. Селектор — это метод, реализованный в контроллере вида. Но прежде, чем перейти к его программированию, определим, что этот метод должен сделать.

1. Найти оба массива с нечетными и четными числами в источнике данных и собрать индексные пути (типа NSIndexPath) чисел больше 2. Позже мы будем пользоваться этими индексными путями для удаления соответствующих ячеек в табличном виде.

2. Удалить все числа больше 2 из источника данных — как из словаря для нечетных чисел, так и из словаря для четных.

3. Удалить из табличного вида соответствующие ячейки. Индексные пути к этим ячейкам мы собрали на первом этапе.

4. Удалить кнопку с навигационной панели. Эта кнопка больше не понадобится, ведь ячейки уже удалены и из источника данных, и из табличного вида. В качестве альтернативы при желании можете просто отключить эту кнопку. Но мне кажется, что для удобства пользователя кнопку лучше просто удалить, поскольку отключенная кнопка все равно будет ему совершенно бесполезна.

— (void) deleteNumbersGreaterThan2:(id)paramSender{

NSMutableArray *arrayOfIndexPathsToDelete =

[[NSMutableArray alloc] init];

NSMutableArray *arrayOfNumberObjectsToDelete =

[[NSMutableArray alloc] init];

/* Шаг 1: собираем объекты, которые мы хотим удалить из

источника данных, а также их индексные пути. */

__block NSUInteger keyIndex = 0;

[self.dictionaryOfNumbers enumerateKeysAndObjectsUsingBlock:

^(NSString *key, NSMutableArray *object, BOOL *stop) {

[object enumerateObjectsUsingBlock:

^(NSNumber *number, NSUInteger numberIndex, BOOL *stop) {

if ([number unsignedIntegerValue] > 2){

NSIndexPath *indexPath =

[NSIndexPath indexPathForRow: numberIndex

inSection: keyIndex];

[arrayOfIndexPathsToDelete addObject: indexPath];

[arrayOfNumberObjectsToDelete addObject: number];

}

}];

keyIndex++;

}];

/* Шаг 2: удаляем объекты из источника данных. */

if ([arrayOfNumberObjectsToDelete count] > 0){

NSMutableArray *arrayOfOddNumbers =

self.dictionaryOfNumbers[SectionOddNumbers];

NSMutableArray *arrayOfEvenNumbers =

self.dictionaryOfNumbers[SectionEvenNumbers];

[arrayOfNumberObjectsToDelete enumerateObjectsUsingBlock:

^(NSNumber *numberToDelete, NSUInteger idx, BOOL *stop) {

if ([arrayOfOddNumbers indexOfObject: numberToDelete]

!= NSNotFound){

[arrayOfOddNumbers removeObject: numberToDelete];

}

if ([arrayOfEvenNumbers indexOfObject: numberToDelete]

Поделиться с друзьями: