Установить тег enum или #define для объекта в конструкторе интерфейса - PullRequest
4 голосов
/ 07 декабря 2011

Когда вы строите много одинаковых объектов, хороший партнер по дизайну устанавливает тег для идентификатора, поэтому:

UITextField *object1, *object2;
//Initialize it
[object1 setDelegate:self];
[object2 setDelegate:self];
[object1 setTag: 1]; 
[object2 setTag: 2];

Чтобы код был проще и «красивее», можно создать перечисление.

typedef enum {
      MyTextField1 = 1,
      MyTextField2
} allTextField;

Таким образом, вы не будете ставить только число и можете установить тег следующим образом:

[object1 setTag: MyTextField1];
[object2 setTag: MyTextField2];

Чем в любой делегатской функции вы можете обращаться с ней проще

- (BOOL)textFieldShouldClear:(UITextField *)textField {
   switch(textField.tag) {
       case MyTextField1: return YES;
       case MyTextField2: return NO;
   }
}

Но, когда вы встраиваете Interface Builder в XCode, вы можете установить тег в этом поле:

enter image description here

Но если я установлю его, я получу:

enter image description here

В Интерфейсном Разработчике нет способа установить что-либо, кроме номера?

Ответы [ 3 ]

2 голосов
/ 07 декабря 2011

Нет способа использовать enum в IB. Потому что IB файлы являются сериализованными объектами. И когда они загружаются во время выполнения, они не могут сделать ссылку на имя перечисления.

1 голос
/ 28 ноября 2013

Определить против Enum

#define может быть проще набирать, потому что вам не нужно = или вам не нужно беспокоиться о конце , между каждым элементом. Но у вас есть дополнительный #define, который менее СУХОЙ. Я использую перечисления, но в любом случае это нормально.

typedef enum {
      SongNameLabelTag = 1,
      PlayButtonTag = 2
} MyViewControllerTags;

против

#define SongNameLabelTag 1
#define PlayButtonTag 2

Соглашение об именах

Я называю теги в формате: <name><short type description>Tag

например. SongNameLabelTag, PlayButtonTag

Значения тега в IB

Цель здесь - не давать элементу один и тот же тег.

Мне неприятно вспоминать последний тег, который я использовал при работе в IB.

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

например. Перемещение элемента в другой контроллер представления. (Я обычно извлекаю группы элементов в отдельные контроллеры представления. Это приведет к тому, что ваша нумерация начнется со странных номеров или столкнется с существующими элементами.)

При быстром прототипировании и быстрой работе меня тормозит необходимость добавления каждого тега элемента как #define. Мне нравится работать как можно быстрее:)


Мое решение - использовать случайные числа . Максимальное значение, которое вы можете использовать, составляет NSIntegerMax (32-bit), что составляет 2147483647.

Самое главное, они должны быть быстро доступны!

Просто добавляйте эту ссылку в закладки каждый раз, когда вам нужны случайные теги:

http://www.random.org/integers/?num=100&min=1&max=999999999&col=1&base=10&format=html&rnd=new

0 голосов
/ 30 мая 2012

Нет, это невозможно, и это позор, потому что технически это может быть реализовано. Специально со всем этим синтаксическим анализатором.

Пока это единственная причина, по которой я вручную кодирую некоторые меню и избегаю конструктора интерфейса.

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