我一直在寻找和阅读,但无法找到任何确凿的方法来实现我想要的目标,并希望在这里找到帮助......
我有一个UITableView,允许用户为食谱添加多种口味和百分比。我已经实现了使用自定义Cell / Nib添加或删除Flavors行的方法,它运行得非常好。
我现在面临的问题是如何检索用户为每个添加的行提供的值。
(编辑为清晰度:我的问题不是填充数据,而只是动态读取所有数据,所以我可以保存它)
我设法获取可见行的值(我确实理解Reuseidentifier和Tableview如何工作,本身对于内存管理而言,iOS只跟踪可见行),但不是隐藏的那些。
我在理论上假设我必须在< cellForRowAtIndexPath'之外创建一个单元格数组。维持所有细胞。但后来我面临另一个概念性问题,即我的自定义笔尖/单元格没有显示......基本上:
这里是我在cellForRowAtIndexPath中使用的代码。如上所述,添加和删除单元格就像魅力一样,这不是问题......
- (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);
}
}
答案 0 :(得分:3)
经过2天的搜索,我终于找到了一个坚实的解决方案。如果有人用tableview碰到动态表单的相同问题,这里有解决方案:
据我们了解,在cellForRowAtIndexPath中创建的单元格只有在显示时才会持续存在。滚动并且单元格消失后,它会自动从内存中抛出。这种行为使得无法在后期迭代所有单元格。
要使其发挥作用的步骤如下:
<强>制备强>
TextField代理
实施:
- (void)textFieldDidEndEditing:(UITextField *)textField
每次Textfield结束编辑时,并更新您的cellsArray对象。本身,获取行的cellObject并使用TextField的值编辑属性
添加行
当你添加一行时,只需在cellArray中添加一个空的cellObject,并在tableView上使用beginUpdates / insertRowsAtIndexPaths / endUpdates(NOT reloadData,因为已经输入的数据会丢失)。另外在addRow方法的最开头添加以下内容,因为您要确保如果用户在编辑文本字段时添加一行,后者也会保留:
[self.view.window endEditing: YES];
删除行
与Add Row相反,从您的cellsArray中删除cellObject并在tableView上使用deleteRowsAtIndexPaths
保存数据
现在有了这个技巧,因为你总是在一个字段结束编辑模式时保留你的数据,你需要覆盖一个案例:如果用户在一个TextField上设置焦点时按下Save会怎么样?在保存操作的最开始,插入以下内容:
[self.view.window endEditing: YES];
这样可以确保最后一次为当前textField调用textFieldEndEditing,并且该数据也将保持不变。
最后遍历你的cellsArray并随心所欲地做任何事情(验证,保存等)......
那就是它,希望这可以帮助其他人,因为我无法在其他任何地方找到任何有价值的解释......
答案 1 :(得分:0)
让我们假设你有一个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;
}
我编写了一个代码来访问元素而不知道你实际拥有什么,所以你需要稍微调整它以适应你的应用程序。