在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的主要内容,如果未能解决你的问题,请参考以下文章