如何自动生成文本字段

时间:2012-04-03 12:47:35

标签: ios ios5

我是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 个答案:

答案 0 :(得分:2)

一般答案

根据您的问题和评论,看起来您希望继续添加任意数量的字段并随时管理它们(保留它们以便您可以访问和操作它们)。您仍然需要编写代码来创建字段并将其存储在某处。

您可以创建一个由您的操作调用的-createAndStoreFieldWithName:方法。这样的方法会使用与上面编写的代码类似的东西,但会将其存储在某个地方。我建议永久存在于控制器中的'NSMutableDictionary',因为字典提供对其内容的命名访问。

这样,如果你想创建一个名为“Foo”的字段,你的-createAndStoreFieldWithName:方法会检查fieldsDictionary字典中是否已存在名为Foo的条目,如果不存在,在代码中创建字段(并将其添加到其超级视图,位于您希望的任何位置)并调用-[fieldsDictionary setObject:newlyCreatedField forKey:fieldName]来存储它。这样,您可以随时通过询问-[fieldsDictionary objectForKey:desiredFieldName]来获取字段。

如果您以后想要删除它们,请使用相同的“按名称获取字段”方法来访问该字段,将其从超级视图中删除,然后将其从字典中删除,以便可以正确处理它。

当然,如果可以存在多个具有相同名称的字段(即,多个Foo字段),则需要添加一个抽象层。在这种情况下,您可以使用用户从未看到的唯一标识符(如UUID)。要弄明白的事情(如果没有更多详细信息,很难指定)是你如何将标识符与正确的字段匹配(例如,考虑到多个Foo字段的可能性)。

此外,你可以只是将字段添加到superview并通过其-subviews数组循环以按标签定位字段,但这是适当的MVC设计的反模式。您的控制器对象(创建标签并将其添加到其他视图的对象)应该跟踪上面提到的这些字段,而不是超级视图。这使得您的控制器成为智能中介,因为它知道这些字段的用途,并将根据需要使用它们(或者可能将它们移交给其他控制器)。

特定情况的答案

但是 - 考虑单个UITextFields是否是正确的方法。也许添加行的UITableView是更好的选择吗?在这种情况下,您的控制器只决定还有一行并踢出表视图进行更新。当被问及单元格时,只需从一些标签容器中提供所需的标签(可能只是控制器维护的标签的直接NSMutableArray - 它将数组索引与行索引匹配)。更简单。

您的问题中的更多细节将为您提供更具体的答案。不过, 再次编辑原始问题 - 请勿继续添加评论。

答案 1 :(得分:1)

我假设你有一个buttonPressed:方法?你的问题不是很清楚,所以如果你想澄清一下,我相信我们可以为你提供更好的答案。假设您有一个名为inputField的textField作为视图控制器的属性,您可以执行以下操作:

- (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并且如果是则为alloc init。如果它不是nil(它已经存在),则只需使用新文本更新text / placeholder属性。

如果每次用户输入文本,您需要在新位置使用新的UITextField,解决方案会有所不同。同样,所有这些答案(我和其他人)都在假设你想要实现的目标。

更新:请允许我适当更新此答案,如前所述。它的长短是使用@ JoshuaNozzi的方法,因为它将实现你想要做的事情。只需更新此内容即可获得完整性。