Общий ответ
Судя по вашему вопросу и комментариям, похоже, что вы хотите продолжать добавлять произвольное количество полей и управлять ими по ходу (держите их рядом, чтобы вы могли обращаться к ним и манипулировать ими). Вам все еще нужно написать код, чтобы создать поле и спрятать его где-нибудь.
Вы можете создать -createAndStoreFieldWithName:
метод, который вызывается вашим действием. Такой метод будет использовать что-то похожее на код, который вы написали выше, но сохранит его где-нибудь. Я бы порекомендовал NSMutableDictionary, который постоянно находится в вашем контроллере, поскольку словари предоставляют именованный доступ к своему контенту.
Таким образом, если вы хотите создать поле с именем "Foo", ваш метод -createAndStoreFieldWithName:
проверит, существует ли уже запись с именем Foo в словаре fieldsDictionary
и, если нет, создаст поле ( и добавьте его в суперпредставление, расположенное где угодно, в коде и вызовите -[fieldsDictionary setObject:newlyCreatedField forKey:fieldName]
, чтобы сохранить его. Таким образом, вы всегда можете получить поле по имени, задав -[fieldsDictionary objectForKey:desiredFieldName]
.
Если вы позже захотите удалить их, используйте тот же подход «получить поле по имени», чтобы получить доступ к полю, удалить его из суперпредставления и удалить из словаря, чтобы его можно было правильно утилизировать.
Конечно, если может существовать несколько полей с одним и тем же именем (т. Е. Более одного поля Foo), вам необходимо добавить слой абстракции. В этом случае вы можете использовать уникальный идентификатор (например, UUID), который пользователь никогда не увидит. Что нужно выяснить (что трудно определить без дополнительной информации от вас), это то, как вы сопоставите идентификатор с соответствующим полем (например, с учетом возможности нескольких полей Foo).
Кроме того, вы могли бы просто добавить поля в суперпредставление и перебрать его массив -subviews, чтобы найти поля по их меткам, но это препятствует правильному проектированию MVC. Ваш контроллерный объект (тот, который создает метки и добавляет их в другие представления) должен отслеживать эти поля, как я упоминал выше, а не супервизор. Это позволяет вашему контроллеру быть интеллектуальным посредником, поскольку он знает, для чего предназначены поля, и будет использовать их (или, возможно, передать их другому контроллеру) по мере необходимости.
Ситуационный ответ
НО - подумайте, являются ли отдельные UITextFields верным путем. Возможно, UITableView с добавленными строками - лучший выбор здесь? В этом случае ваш контроллер просто решает, что есть еще одна строка, и запускает табличное представление для обновления. Когда спросят о ячейке, просто дайте ей желаемую метку из некоторого контейнера меток (может быть, просто прямой NSMutableArray меток, поддерживаемых вашим контроллером - он сопоставляет индекс массива с индексом строки). НАМНОГО проще.
Более подробно в вашем вопросе вы получите более конкретные ответы. Опять же, отредактируйте исходный вопрос - не добавляйте комментарии.