Совместное действие для многих кнопок UIB, получить строку, специфичную для кнопки - PullRequest
2 голосов
/ 02 декабря 2010

У меня есть представление, содержащее несколько кнопок UIB «Том и Джерри», «Король Лев» и т. Д. Я хочу, чтобы все они вызывали одно и то же действие в моем контроллере представления, а затем различали разные кнопки для специфичная для кнопки NSString (например, идентификаторы, такие как "TomJerry", "LionKing").

Идеи:

  1. Злоупотребление свойство текста заголовка кнопки (пользовательский стиль кнопки, чистый цвет текста).
    • Работает, но чувствует себя грязным ... (и работает, только если кнопка не должна отображать текст.)
  2. Подкласс UIButton с дополнительным свойством ivar + свойство context.
    • Отлично подходит для добавления кнопок программно,
    • но: мое представление загружается из Nib, поэтому мне придется определить выход для каждой кнопки (и установить его свойство context в awakeFromNib или viewDidLoad). BLEH ...
  3. Создайте подкласс для каждой кнопки с различными реализациями метода "- (NSString *) context".
    • Тьфу ... серьезно? ; -)
  4. Используйте теги для определения кнопок и словарь для сопоставления тегов со строками, специфичными для кнопок.
    • СУХОЕ нарушение: тег нужно будет знать / указывать дважды - в Nib, чтобы идентифицировать кнопку, и в словаре, чтобы получить соответствующую строку.
    • До сих пор я избегал использования тегов. Может быть, это была бы хорошая возможность начать?

Как лучше всего этого достичь? Любые идеи, лучшие практики, шаблоны реализации?


Обновление: После прочтения первых ответов (спасибо!), Я считаю, что я должен добавить некоторые моменты для уточнения.

Все вышеперечисленные подходы должны работать ; Дело в том, что я не особо люблю ни одного из них. Я спрашиваю вас, какой из подходов вы бы предпочли (и почему), или есть ли другие лучшие подходы.

Дополнительные «требования»:

  • Я не хочу подключать каждую кнопку как розетку.
  • Я хочу получить строку, относящуюся к кнопке, в общем виде, т. Е. Нет переключателя на отправителя действия, как у if (sender==self.button1) {…} else if (sender==self.button2) {…}

Ответы [ 3 ]

2 голосов
/ 02 декабря 2010

Добавлено
Можно создать категорию UIButton, добавив метод, который возвращает строку NSString на основе тега.У вас все еще есть потенциальные проблемы с тегами, но преобразование тега в строку - актуальное и концептуальное - все в одном месте.

Я полагаю, что это соответствует вашим оригинальным и дополнительным требованиям.


Ранее
Теги быстрые и легкие, сравнивая два целых числа.

Вы можете легко создать схему нумерации, которая четко разделяет вещи: 1000-1999 - это вещи такого типа, 1000-1099 - это подгруппа, 1015 - это экземпляр и т. Д.

Числовые сравнениядоступны: x.tag> 10000 сделать это.

Очевидно, что это означает, что вы должны отслеживать это, и ваш код может оказаться трудным для анализа в будущем.Тем не менее, некоторые изящные преимущества.

0 голосов
/ 02 декабря 2010

Для этого контекста лучший способ - создать подкласс класса UIButton и добавить свойство, такое как index, или любые другие свойства, которые будут вам полезны.

или еще

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

С уважением,

Сатья

0 голосов
/ 02 декабря 2010

Вы можете сравнить ссылку кнопки в обработчике кнопки.

IBOutlet UIButton *button1;
IBOutlet UIButton *button2;

-(IBAction)myButtonHanlder:(id)sender {
    if (sender == button1) {
        // do task for button1
    } else if (sender == button2) {
        // do task for button2
    }
}

ПРИМЕЧАНИЕ. Я не скомпилировал код.Но я думаю, у вас есть идея.

Мой комментарий по поводу ваших идей:

  1. Вполне естественно изменить текст заголовка, цвет и т. Д. Рабочий процесс кнопок не должен сильно зависеть от видаstyle.

  2. Создание подкласса UIButton только для этого сравнения - слишком много работы.

  3. Это еще более грязная версия 2.

  4. Что ж, вы должны быть очень осторожны, чтобы не использовать один и тот же тег для двух разныхкнопка.

...