如何在uiTableView中以编程方式获取uiTextField的值?

时间:2014-03-03 10:07:18

标签: ios iphone objective-c uitableview

我是iOS的初学者,我尝试获取以编程方式创建的uiTextField的值。

所以我的问题是我在一个带有.json文件的UITableViewController中创建一个表单。我已经创建了我的表单,但我不知道如何获得不同的值。

在我的cellForRowAtIndexPath中,我创建了不同的元素(我有textFields,带有picker和uiswitch的textFields)。当用户完成填写表单后,他点击“保存”按钮,这就是我想获取我的价值。

如果有人可以帮助我并提供一些代码来解释.... :)谢谢。

我的一些代码:

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

{

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
NSString *cellValue = [self getItemName:indexPath.section and:indexPath.row];
cell.textLabel.text = cellValue;
cell.selectionStyle = UITableViewCellSelectionStyleNone;

NSString *itemType=[self getItemType:indexPath.section and:indexPath.row];
NSLog(@"%@",itemType);

if ([itemType isEqualToString:@"text"]) {
    UITextField *Reference = [self createTextField];
    [cell.contentView addSubview:Reference];
}else if ([itemType isEqualToString:@"checkbox"]) {
    UIView *checkbox = [self createCheckbox:indexPath.section and:indexPath.row];
    [cell.contentView addSubview:checkbox];
}else if ([itemType isEqualToString:@"picker"]) {
    UITextField *Reference = [self createPicker:indexPath.section and:indexPath.row];
    [cell.contentView addSubview:Reference];
}else if ([itemType isEqualToString:@"datePicker"]) {
    UITextField *Reference = [self createDatePicker];
    [cell.contentView addSubview:Reference];
}
return cell;
}

我在这里动态创建元素。例如,uixtField:

-(UITextField*)createTextField{
UITextField *Reference = [[UITextField alloc] initWithFrame:CGRectMake(200 , 10, 200, 40)];
Reference.layer.borderColor=[[UIColor blackColor]CGColor];
Reference.layer.borderWidth=1.0f;

Reference.textAlignment=NSTextAlignmentCenter;
Reference.tag=_tag;
_tag++;
return Reference;
}

http://hpics.li/04b98ca 这是我用动力生成的一个例子。

4 个答案:

答案 0 :(得分:2)

使用:

[textField setTag:(integer value)]

cellForRow...方法中创建字段时。

然后在saveMethod中使用:

[[tableView cellForIndexPath:indexPath] viewWithTag:(integer value)]

获取混凝土单元的混凝土场。

if ([itemType isEqualToString:@"text"]) {
    UITextField *Reference = [self createTextField];
    [Reference setTag:1];
    [cell.contentView addSubview:Reference];
}

-(void)saveMethod
{
    NSString *string = [[[self.tableView cellForRowAtIndexPath:indexPath] viewwithTag:1] text];
}

答案 1 :(得分:1)

如果您希望从中获取信息,则可以在单元格的方法cellForRowAtIndexPath中创建元素,因为获取信息非常困难。

最好的方法是使用所需的所有元素创建自定义UITableViewCell,然后在方法didSelectRowAtIndexPath中获取元素的信息。

答案 2 :(得分:0)

从视图中获取indexPath的方法是检查superview,直到获得父单元格,然后使用-indexPathForCell:

- (UITableViewCell *)cellForView:(UIView *)view
{
    while (view != nil && ![view isKindOfClass:[UITableViewCell class]]) {
        view = view.superview;
    }

    return (UITableViewCell *)view;
}

- (NSIndexPath *)indexPathForView:(UIView *)view
{
    return [self.tableView indexPathForCell:[self cellForView:view]];
}

总的来说,这个解决方案会遇到问题。单元格不会在表格视图中保留。一旦单元格离开屏幕,它就会被表格视图回收。

这意味着您不应尝试将数据存储在单元格中。单元格用于显示数据并获取用户输入,但从不存储数据。数据应存储在表数据源中。

此外,这意味着在将子视图添加到单元格时需要小心。当单元格被回收时,您在之前使用中添加的视图仍将位于单元格中。您需要有-tableView:cellForRowAtIndexPath:的清理部分才能删除之前添加的所有视图。


我的建议是继承UITableViewCell。您可以拥有4个子类,每个JSON类型一个,或者有1个子类,可以用4种不同的方式实例化。在我的例子中,我有1个子类,可以用4种不同的方式实例化。

通过使用不同的重用标识符来区分不同类型的细胞。

使用目标/操作和委托从单元格上的控件获取输入。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellIdentifier = nil;
    NSString *itemType=[self getItemType:indexPath.section and:indexPath.row];
    NSLog(@"%@",itemType);

    if ([itemType isEqualToString:@"text"]) {
        cellIdentifier = @"TextCell";
    } else if ([itemType isEqualToString:@"checkbox"]) {
        cellIdentifier = @"CheckboxCell";
    } else if ([itemType isEqualToString:@"picker"]) {
        cellIdentifier = @"PickerCell";
    } else if ([itemType isEqualToString:@"datePicker"]) {
        cellIdentifier = @"DatePickerCell";
    }

    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {
        if ([cellIdentifier isEqualToString:@"TextCell"]) {
            cell = [MyTableViewCell textCellWithIdentifier:cellIdentifier];
        } else if ([cellIdentifier isEqualToString:@"CheckboxCell"]) {
            cell = [MyTableViewCell checkboxCellWithIdentifier:cellIdentifier];
        } else if ([cellIdentifier isEqualToString:@"PickerCell"]) {
            cell = [MyTableViewCell pickerCellWithIdentifier:cellIdentifier];
        } else if ([cellIdentifier isEqualToString:@"DatePickerCell"]) {
            cell = [MyTableViewCell datePickerCellWithIdentifier:cellIdentifier];
        }
    }

    NSString *itemName = [self getItemName:indexPath.section and:indexPath.row];
    cell.textLabel.text = itemName;

    if ([itemType isEqualToString:@"text"]) {
        NSString *itemValue = [self getItemValue:indexPath.section and:indexPath.row];
        cell.textField.text = itemValue;
    } else if ([itemType isEqualToString:@"checkbox"]) {
        BOOL itemChecked = [self getItemChecked:indexPath.section and:indexPath.row];
        cell.checkbox.selected = itemChecked;
    } else if ([itemType isEqualToString:@"picker"]) {
        NSString *itemValue = [self getItemValue:indexPath.section and:indexPath.row];
        cell.pickerLabel = itemValue;
    } else if ([itemType isEqualToString:@"datePicker"]) {
        NSDate *itemDate = [self getItemDate:indexPath.section and:indexPath.row];
        cell.datePickerLabel = itemDate;
    }

    return cell;
}

答案 3 :(得分:0)

对于我的问题,我创建了一个NSMutableDictionary我在其中放置了我的元素:

key:“name”

值:“UITextField

就像我可以在课堂上到处找到textField一样。

<。>文件中的

创建字典

in .m

只需放置元素,当你想要去文本值时:

UITextField* myTextField= [dictionnary objectForKey:key];