在ios中使用标签动态生成和访问UITextField

Posted

技术标签:

【中文标题】在ios中使用标签动态生成和访问UITextField【英文标题】:Dynamically generate and access UITextField using tag in ios 【发布时间】:2014-12-11 10:22:47 【问题描述】:

我有一个像这样动态生成 UITextField 的代码:

 UITextField *myTextfield;
    - (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section


    UIView* headerView = [[UIView alloc] initWithFrame: CGRectMake(0.0f, 0.0f, 640.0f, 0.0f)];
      //for (int i=0; i<4; i++) 
        myTextfield = [[UITextField alloc] initWithFrame:CGRectMake(20, 60*i+20, 280, 45)];
        myTextfield.text = [NSString stringWithFormat:@"Value: %d", section];
        myTextfield.enabled = NO;
        myTextField.tag = section;
        [headerView addSubview:myTextField];
    

我还在每个文本字段旁边生成了一个编辑按钮

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath         
        static NSString *CustomCellIdentifier = @"cell1";
        cell = (ButtonCell *)[tableView dequeueReusableCellWithIdentifier: CustomCellIdentifier];
        if (cell == nil) 
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ButtonCell"
                                                         owner:self options:nil];
            for (id oneObject in nib) if ([oneObject isKindOfClass:[ButtonCell class]])
                cell = (ButtonCell *)oneObject;

        
        cell.msg_btn.tag = indexPath.section;
        cell.changecolor_btn.tag = indexPath.section;
        cell.picklist_btn.tag = indexPath.section;
        cell.adddelsubmenu_btn.tag = indexPath.section;
        cell.done_btn.tag = indexPath.section;

        [cell.msg_btn addTarget:self action:@selector(editEachTextField:) forControlEvents:UIControlEventTouchUpInside];

        return cell;

现在我想在单击其中一个按钮时启用和访问每个文本字段。我正在使用 tag 来访问这些文本字段,如下所示:

- (void) editEachTextField:(UIButton*)sender

  myTextfield = (UITextField *)[self.view viewWithTag:myTextfield.tag];
    myTextfield.enabled = YES;
    [myTextfield becomeFirstResponder];

    NSLog(@"Tag value of Textfield: %ld",(long)myTextfield.tag);
    NSString *text = [(UITextField *)[self.view viewWithTag:myTextfield.tag] text];
    NSLog(@"Value: %@", text);

但是,每当我单击其中一个按钮时,它都会返回标签 value=4 并且启用第 4 个文本字段进行编辑。有什么问题?

【问题讨论】:

不要从标记 0 开始,默认情况下每个视图都使用它。您应该使用包含 1..5 的标签,而不是 0..4。 @cyrille:非常感谢!!! 【参考方案1】:

您使用myTextfield.tag 值来启用文本字段而不是单击按钮的标记。 myTextfield 指向最后分配的UITextField(标签为 4),这就是为什么您将标签值设为 4 并且启用了最后一个文本字段。

问题在于这段代码:

myTextfield = (UITextField *)[self.view viewWithTag:myTextfield.tag];

将其更改为:

myTextfield = (UITextField *)[self.view viewWithTag:sender.tag];

注意:

如果按钮和文本字段都放置在同一个视图中,请不要对按钮和文本字段使用相同的标签。如果这样做,您将无法确定在使用 viewWithTag 时将获得哪个对象。

【讨论】:

好的,我相应地更改了代码并尝试了myTextfield.tag=sender.tag; myTextfield.enabled = YES;,但第4个字段一直处于启用状态。 你能展示按钮创建代码吗?你为什么用myTextfield.tag=sender.tag;【参考方案2】:

在@Midhun MP 和@Cyrille 的帮助下,我终于自己解决了。

UITextField *myTextfield;
    - (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section


    UIView* headerView = [[UIView alloc] initWithFrame: CGRectMake(0.0f, 0.0f, 640.0f, 0.0f)];
      //for (int i=0; i<4; i++) 
        myTextfield = [[UITextField alloc] initWithFrame:CGRectMake(20, 60*i+20, 280, 45)];
        myTextfield.text = [NSString stringWithFormat:@"Value: %d", section];
        myTextfield.enabled = NO;
        myTextField.tag = 400+section;
        [headerView addSubview:myTextField];
    

和按钮动作选择器:

- (void) editEachTextField:(UIButton*)sender

  myTextfield = (UITextField *)[self.view viewWithTag:400+sender.tag];
    myTextfield.enabled = YES;
    [myTextfield becomeFirstResponder];

    NSString *text = [(UITextField *)[self.view viewWithTag:400+sender.tag] text];
    NSLog(@"Value: %@", text);

【讨论】:

【参考方案3】:
UITextField *txtfield = (UITextField *)sender;
NSLog(@"%ld",(long)txtfield.tag);

【讨论】:

这本身还不够。您确实需要为此添加更多内容。

以上是关于在ios中使用标签动态生成和访问UITextField的主要内容,如果未能解决你的问题,请参考以下文章

如何从动态生成的 UITextField 中检索数据?

动态生成的HTML标签样式问题

界面生成器中的 iOS 多行标签

如何在 iOS 11 中支持大标签栏预览?

在 iOS 7 中动态调整标签大小

基于动态标签高度的 iOS8 动态单元格高度