我是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 这是我用动力生成的一个例子。
答案 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];