iOS动态表单在UITableViewCells中,检索值
我一直在搜索和阅读,但找不到任何结论性的方法来实现我想要的,并希望在这里找到帮助 我有一个UITableView,它允许用户将多种口味和百分比添加到配方中。我已经实现了使用自定义单元格/笔尖添加或删除香料行的方法,效果非常好 我现在面临的问题是如何检索用户为每个添加行提供的值 (为清晰起见进行编辑:我的问题不是填充数据,而是动态读取所有数据以便保存) 我确实设法获得了可见行的值(我确实了解Reuseidentifier和Tableview是如何工作的,就其本身而言,为了内存管理,iOS只跟踪可见行),但不跟踪隐藏行 理论上,我假设我必须在维护所有单元格的“cellForRowAtIndexPath”之外创建一个单元格数组。但是,我面临另一个概念性问题,我的定制笔尖/单元格没有显示。。。。基本上:iOS动态表单在UITableViewCells中,检索值,ios,iphone,forms,uitableview,dynamic,Ios,Iphone,Forms,Uitableview,Dynamic,我一直在搜索和阅读,但找不到任何结论性的方法来实现我想要的,并希望在这里找到帮助 我有一个UITableView,它允许用户将多种口味和百分比添加到配方中。我已经实现了使用自定义单元格/笔尖添加或删除香料行的方法,效果非常好 我现在面临的问题是如何检索用户为每个添加行提供的值 (为清晰起见进行编辑:我的问题不是填充数据,而是动态读取所有数据以便保存) 我确实设法获得了可见行的值(我确实了解Reuseidentifier和Tableview是如何工作的,就其本身而言,为了内存管理,iOS只跟踪可见
- 然后,如何在不使用dequeingidentifier的情况下使用/注册nib
- 或者一般来说,如何解决总体问题,以便能够读取每行用户输入的所有值
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
RecipeFlavourTableViewCell *cell;
int section = (int)indexPath.section;
if(section==0)
return [super tableView:tableView cellForRowAtIndexPath:indexPath];
if(!cell){
[tableView registerNib:[UINib nibWithNibName:@"RecipeFlavourCell" bundle:nil] forCellReuseIdentifier:@"Cell"];
cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
我见过一些库在做这件事(例如XLForm),但不明白(在检查它们的源代码时也是如此)它们是如何迭代这些值并克服这个出列问题的
非常感谢您的帮助
编辑2:这里是我用来遍历单元格以保存数据的代码,但正如前面所说,我只能遍历可见单元格:
- (IBAction)saveRecipe:(id)sender {
NSInteger dynamicRows = [self.tableView numberOfRowsInSection:1];
for (int i=0; i<dynamicRows; i++) {
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:1];
RecipeFlavourTableViewCell *cell = (RecipeFlavourTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath];
NSLog(cell.flavour.text);
}
-(iAction)saveRecipe:(id)发送方{
NSInteger dynamicRows=[self.tableView行数部分:1];
对于(int i=0;i让我们假设您有一个NSArray,其中包含要显示的数据。您的代码应该如下所示:
// Add this property to the class and fill it in with data you want to show
@property NSArray flavourElements;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
RecipeFlavourTableViewCell *cell;
int section = (int)indexPath.section;
if(section==0)
return [super tableView:tableView cellForRowAtIndexPath:indexPath];
if(!cell){
[tableView registerNib:[UINib nibWithNibName:@"RecipeFlavourCell" bundle:nil] forCellReuseIdentifier:@"Cell"];
cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
// At this point your cell is ready for showing
// And you can change values in it by getting element from array that contains data
cell.flavorTextField = flavourElements[indexPath.row].flavour
cell.precentageTextField = flavourElements[indexPath.row].precentage
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
我编写了一个代码,用于在不知道您实际拥有什么的情况下访问元素,因此您需要对其进行一点调整,以适应您的应用程序。经过两天的搜索,我终于找到了一个解决方案。如果有人在tableview中遇到同样的动态表单问题,下面是解决方案:
据我们所知,cellForRowAtIndexPath中创建的任何单元格,只在显示时才持续存在。一旦滚动单元格并消失,它就会自动从内存中抛出。这种行为使得以后不可能遍历所有单元格
要使其正常工作,请遵循以下步骤:
准备
- 创建一个NSObject,其中包含所有要保留在一个表单单元格(->cellObject)中的属性
- 在控制器的ViewDidLoad中创建一个NSMutableArray,其中将包含cellObjects(-cellsArray)
- 向cellsArray添加最初希望在Tableview中显示的cellsArray中的CellObject
- 在numberOfRowsInSection中,返回您的单元格数
- 在cellForRowAtIndexPath中,像往常一样构建单元格,但向单元格中的每个文本字段添加一个Textfield委托(self)
TextField委托
实施:
- (void)textFieldDidEndEditing:(UITextField *)textField
并在每次Textfield结束编辑时更新cellsArray对象。本质上,获取行的cellObject并使用Textfield的值编辑属性
添加行
添加行时,只需将空的cellObject添加到CellsRay中,并在tableView上使用BeginUpdate/insertRowsAtIndexPaths/EndUpdate(不要重新加载数据,因为已经键入的数据会丢失)。另外,在addRow方法的最开始处添加以下内容,因为您希望确保如果用户在编辑文本字段时添加一行,后者也会被持久化:
[self.view.window endEditing: YES];
删除行
与“添加行”相同,只需反向操作,从cellsArray中删除cellObject并在tableView上使用DeleteRowsAndExpath
保存数据
现在,诀窍来了:由于当字段结束编辑模式时,您应该始终保持数据,因此您需要介绍一种情况:当焦点设置在一个文本字段上时,如果用户按下“保存”,该怎么办?在保存操作的最开始插入以下内容:
[self.view.window endEditing: YES];
这将确保当前textField的textFieldEndEditing将被最后一次触发,并且其数据也将被持久化
最后,遍历你的cellsArray并用它做任何你想做的事情(验证、保存等)
就是这样,希望这能帮助其他人,因为我在其他地方找不到任何有价值的解释…您将要填充到表中的信息保存在哪里?如下所述,我的问题不是填充,而是读取和保存用户输入的数据。这是您不使用se时遇到的典型问题很好地将模型与视图分开…我认为可以过度使用整个MVC架构,但这是一件非常好的事情。您确实希望有一个用于填充单元格的底层数据模型(最初是空的,是的),以及一个单独的控制器,用于维护用户输入的当前数据,并在用户界面中挂接,以便在输入新值时不断更新模型。@RobP我最终得出了一个类似的结论,请参见下面的答案。我建议的不同之处在于,您不需要在UITableViewCells数组周围保留一个值。您有一个组件工作是以您自己有用的抽象形式保留一堆配方数据——最初可能作为NSArray。您可以从该数据填充UITableViewCells,然后编辑单元格返回以更改该数据。然后底层数据表示可以移动directl