使用标记检索UITextField

时间:2011-02-21 07:37:44

标签: iphone objective-c ios

我有以下代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (indexPath.row == 0)
        cell.tag = 0;
    else {
        cell.tag = 1;
    }

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

        UILabel *startDtLbl = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 80, 25)];
        if (indexPath.row == 0)
            startDtLbl.text = @"Username";
        else {
            startDtLbl.text = @"Password";
        }

        startDtLbl.backgroundColor = [UIColor clearColor];

        [cell.contentView addSubview:startDtLbl];

        UITextField *passwordTF = [[UITextField alloc] initWithFrame:CGRectMake(100, 5, 200, 35)];
        passwordTF.delegate = self;
        if (indexPath.row == 0)
            passwordTF.tag = 2;
        else {
            passwordTF.tag = 3;
        }
        [cell.contentView addSubview:passwordTF];
    }
    return cell;
}

我想获得UITextField,我该怎么做?我尝试过以下操作但失败了:

UITableViewCell * username_cell = (UITableViewCell*)[self.view viewWithTag:0];
    UITableViewCell * password_cell = (UITableViewCell*)[self.view viewWithTag:1];

    UITextField * username = (UITextField*)[username_cell.contentView viewWithTag:2];
    UITextField * password = (UITextField*)[password_cell.contentView viewWithTag:3];
    NSLog(@"Username is %@", [username text]);
    NSLog(@"Password is %@", [password text]);

5 个答案:

答案 0 :(得分:6)

你应该停止使用标签来获取细胞。您应该使用indexPaths。

替换

UITableViewCell * username_cell = (UITableViewCell*)[self.view viewWithTag:0];
UITableViewCell * password_cell = (UITableViewCell*)[self.view viewWithTag:1];

NSIndexPath *indexPathUserName = [NSIndexPath indexPathForRow:0 inSection:0];
UITableViewCell * username_cell = [self.tableView cellForRowAtIndexPath:indexPathUserName];
NSIndexPath *indexPathPassword = [NSIndexPath indexPathForRow:1 inSection:0];
UITableViewCell * password_cell = [self.tableView cellForRowAtIndexPath:indexPathPassword];

当您想要引用特定视图时,您不能使用标记0.因为所有没有自定义标记的标记都具有0的标记。因此,如果您使用viewWithTag:0,则会获得最后添加的视图。而且通常这不是你想要的观点。

答案 1 :(得分:2)

如果您的文本字段位于uiscrollview内并动态递增

int i=0;
    for (UIView *subview in ContentScroll.subviews) {
        UITextField *textField = (UITextField*)[ subview viewWithTag:i];
        NSLog(@"%@",textField.text);
        NSString *fieldValue = textField.text;
        if ([fieldValue isEqual:[NSNull null]]) {
            NSLog(@"as");     
        }else{
            NSLog(@"Field %d has value: %@", i, fieldValue);
        }
        i++;
    }

答案 2 :(得分:1)

我在这里回答了你的问题login using UITableView

答案 3 :(得分:1)

该表似乎只显示用户名和密码,因此我建议保留两个指向创建的文本字段的指针。这将消除对标签的需要。可以消除用于标记单元格的代码,并且可以更新标记文本字段的代码以将指针存储在视图的控制器中。

    UITextField *passwordTF = [[UITextField alloc] initWithFrame:CGRectMake(100, 5, 200, 35)];
    passwordTF.delegate = self;
    if (indexPath.row == 0)
        self.passwordTextField = passwordTF;
    else {
        self.usernameTextField = passwordTF;
    }
    [cell.contentView addSubview:passwordTF];

答案 4 :(得分:-1)

我认为问题出现在这段代码的第一层:

而不是:

UITableViewCell * username_cell = (UITableViewCell*)[self.view viewWithTag:0];
UITableViewCell * password_cell = (UITableViewCell*)[self.view viewWithTag:1];

使用此:

UITableViewCell * username_cell = (UITableViewCell*)[self.tableView viewWithTag:0];
UITableViewCell * password_cell = (UITableViewCell*)[self.tableView viewWithTag:1];

或者您的tableview的名称。您正试图从self.view获取UITableViewCells,但UITableViewCells是tableview的子视图。

<强>替代

如果这不起作用,那么您可以使用

找到UITablViewCells
NSArray *arrTableViewCells = [tableView subviews];

然后从这些单元格中获取UITextField。

应该有效