Как я могу автоматически генерировать текстовые поля - PullRequest
0 голосов
/ 03 апреля 2012

Я новичок в iOS и занят своим первым приложением.У меня есть вопрос: в приведенном ниже коде есть ли способ, чтобы мое приложение автоматически генерировало текстовое поле, когда кнопка нажата, и мне не нужно сначала его настраивать?

Например, в приведенном ниже коде это будетможно получить ввод из текстового поля и использовать его вместо «field1» для автоматического создания другого текстового поля.

UITextField *field1 = [[UITextField alloc] initWithFrame:CGRectMake(10, 10, 100, 30)];
field1.placeholder = @"Textbox 1";
field1.borderStyle = UITextBorderStyleRoundedRect;
[self.view addSubview:field1];

x = 10;
w = 100;
h = 30;

y = y + 60;

UITextField *field1 = [[UITextField alloc] initWithFrame:CGRectMake(x, y, w, h)];
field1.placeholder = @"Textbox 1";
field1.borderStyle = UITextBorderStyleRoundedRect;
[self.view addSubview:field1];

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

Теперь 2 вопроса по вышеупомянутому, могу ли я получить индивидуальный доступ к текстовым полям, используя этот метод.
Это считается наилучшей практикой или просто использует много памяти.

Ответы [ 2 ]

2 голосов
/ 03 апреля 2012

Общий ответ

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

Вы можете создать -createAndStoreFieldWithName: метод, который вызывается вашим действием. Такой метод будет использовать что-то похожее на код, который вы написали выше, но сохранит его где-нибудь. Я бы порекомендовал NSMutableDictionary, который постоянно находится в вашем контроллере, поскольку словари предоставляют именованный доступ к своему контенту.

Таким образом, если вы хотите создать поле с именем "Foo", ваш метод -createAndStoreFieldWithName: проверит, существует ли уже запись с именем Foo в словаре fieldsDictionary и, если нет, создаст поле ( и добавьте его в суперпредставление, расположенное где угодно, в коде и вызовите -[fieldsDictionary setObject:newlyCreatedField forKey:fieldName], чтобы сохранить его. Таким образом, вы всегда можете получить поле по имени, задав -[fieldsDictionary objectForKey:desiredFieldName].

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

Конечно, если может существовать несколько полей с одним и тем же именем (т. Е. Более одного поля Foo), вам необходимо добавить слой абстракции. В этом случае вы можете использовать уникальный идентификатор (например, UUID), который пользователь никогда не увидит. Что нужно выяснить (что трудно определить без дополнительной информации от вас), это то, как вы сопоставите идентификатор с соответствующим полем (например, с учетом возможности нескольких полей Foo).

Кроме того, вы могли бы просто добавить поля в суперпредставление и перебрать его массив -subviews, чтобы найти поля по их меткам, но это препятствует правильному проектированию MVC. Ваш контроллерный объект (тот, который создает метки и добавляет их в другие представления) должен отслеживать эти поля, как я упоминал выше, а не супервизор. Это позволяет вашему контроллеру быть интеллектуальным посредником, поскольку он знает, для чего предназначены поля, и будет использовать их (или, возможно, передать их другому контроллеру) по мере необходимости.

Ситуационный ответ

НО - подумайте, являются ли отдельные UITextFields верным путем. Возможно, UITableView с добавленными строками - лучший выбор здесь? В этом случае ваш контроллер просто решает, что есть еще одна строка, и запускает табличное представление для обновления. Когда спросят о ячейке, просто дайте ей желаемую метку из некоторого контейнера меток (может быть, просто прямой NSMutableArray меток, поддерживаемых вашим контроллером - он сопоставляет индекс массива с индексом строки). НАМНОГО проще.

Более подробно в вашем вопросе вы получите более конкретные ответы. Опять же, отредактируйте исходный вопрос - не добавляйте комментарии.

1 голос
/ 03 апреля 2012

Я полагаю, у вас есть кнопкаPressed: метод?Ваш вопрос не очень ясен, поэтому, если вы хотите уточнить, я уверен, что мы можем предоставить вам лучший ответ.Предполагая, что у вас есть textField с именем inputField в качестве свойства вашего контроллера представления, вы можете сделать что-то вроде этого:

- (void)buttonPressed:(id)sender {
    NSString *currentText = self.inputField.text;

    UITextField *newTextField = [[UITextField alloc] initWithFrame:CGRectMake(10, 10, 100, 30)];
    newTextField.placeholder = currentText;
    newTextField.borderStyle = UITextBorderStyleRoundedRect;

    [self.view addSubview:newTextField];
}

Это создаст новый UITextField при нажатии кнопки с текстом заполнителя, установленным на то, что было в вашемдругое UITextField.Это предполагает, что вы просто хотите сделать это один раз, и у вас есть только один новый UITextField.Если вы можете сделать это несколько раз, но по-прежнему хотите, чтобы единственный UITextField обновлялся новым текстом, newTextField должен быть свойством, и вы проверяете, не равен ли он nil, и выделяете init, если он есть.Если это не ноль (он уже существует), вам нужно только обновить свойство text / placeholder новым текстом.

Если каждый раз, когда пользователь вводит текст, вам нужен новый UITextField в новом месте, решениебыло бы немного по-другому.Опять же, все эти ответы (мой и другие) делают предположения о том, чего вы пытаетесь достичь.

ОБНОВЛЕНИЕ: Позвольте мне соответствующим образом обновить этот ответ, как было указано ранее.В общем и целом, было бы использовать подход @ JoshuaNozzi, поскольку он достиг бы того, что вы пытаетесь сделать.Просто обновляю это для полноты.

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