Хотя я согласен, что тег будет работать во многих обстоятельствах, работать с целочисленными тегами очень сложно, когда у вас есть матрица из 100 кнопок, которые можно нажимать там, где вы хотите определить: (1) что было нажато и (2) что значение было сдвинуто. Я начал изобретать схемы именования строк / столбцов с номерами тегов, которые вышли из-под контроля.
Я хотел, чтобы несколько элементов управления совместно использовали один и тот же обработчик, и я хотел тщательно спроектировать свой пользовательский интерфейс в IB для передачи пар имя / значение в хранилище ключ-значение на основе того, что было отправлено.
В качестве альтернативы тегам я предложил другой обходной путь для UISegmentedControl (он работает и для других элементов управления).
(1) Создайте новый класс и подкласс UISegmentedControl. Добавьте строковое свойство MyCustomKey в ваш новый класс.
@interface CustomSegmentedControl : UISegmentedControl
@property (nonatomic, retain) NSString* myCustomKey;
@end
(2) Вернувшись в IB, измените ваши экземпляры UISegmentedContol, чтобы они были экземплярами CustomSegmentedControl. Использовал IB «Определенные пользователем атрибуты времени выполнения», чтобы установить значение myCustomKey с помощью IB. KeyValueCoding позаботится о настройке свойств для вас:
(3) Подключите все свои кнопки к одному IBAction.
(4) Теперь в вашем IBAction вы можете извлечь пары ключ-значение, прочитав свой пользовательский атрибут:
- (IBAction)myButtonPressed:(id) sender
{
if ([sender isKindOfClass:[CustomSegmentedControl class]] == false)
return;
// get the key-values from the control
CustomSegmentedControl *control = (CustomSegmentedControl *)sender;
NSString *key = [control valueForKey:@"myCustomKey"];
NSNumber *value = [NSNumber numberWithInteger:[control selectedSegmentIndex]];
NSLog(@"Pressed control %@ with a value of %@", key, value);
}
В этом случае меня интересовало только целочисленное значение сегментированного элемента управления, но вы могли получить любое свойство из элемента управления в качестве значения.
Надеюсь, это поможет.