UITableViewCells中的iOS动态表单,检索值

时间:2014-12-05 12:00:48

标签: ios iphone forms uitableview dynamic

我一直在寻找和阅读,但无法找到任何确凿的方法来实现我想要的目标,并希望在这里找到帮助......

我有一个UITableView,允许用户为食谱添加多种口味和百分比。我已经实现了使用自定义Cell / Nib添加或删除Flavors行的方法,它运行得非常好。

我现在面临的问题是如何检索用户为每个添加的行提供的值

(编辑为清晰度:我的问题不是填充数据,而只是动态读取所有数据,所以我可以保存它)

我设法获取可见行的值(我确实理解Reuseidentifier和Tableview如何工作,本身对于内存管理而言,iOS只跟踪可见行),但不是隐藏的那些。

我在理论上假设我必须在< cellForRowAtIndexPath'之外创​​建一个单元格数组。维持所有细胞。但后来我面临另一个概念性问题,即我的自定义笔尖/单元格没有显示......基本上:

  • 如何在不使用dequeingidentifier
  • 的情况下使用/注册笔尖
  • 或者一般情况下,如何解决整体问题,以便能够读取所有用户每行输入的值

Screenshot TableView

这里是我在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);
    }

}

2 个答案:

答案 0 :(得分:3)

经过2天的搜索,我终于找到了一个坚实的解决方案。如果有人用tableview碰到动态表单的相同问题,这里有解决方案:

据我们了解,在cellForRowAtIndexPath中创建的单元格只有在显示时才会持续存在。滚动并且单元格消失后,它会自动从内存中抛出。这种行为使得无法在后期迭代所有单元格。

要使其发挥作用的步骤如下:

<强>制备

  • 使用要在一个表单单元格中保留的所有属性创建一个NSObject( - &gt; cellObject)
  • 在控制器的ViewDidLoad中创建一个NSMutableArray,它将包含cellObjects(-cellsArray)
  • 将最多想要显示在Tableview
  • 中的cellObjects添加到cellsArray中
  • 在numberOfRowsInSection中返回您的cellsArray的数量
  • 在cellForRowAtIndexPath中像往常一样构建单元格但是向单元格中的每个Textfield添加Textfield Delegate(self)

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;

}

我编写了一个代码来访问元素而不知道你实际拥有什么,所以你需要稍微调整它以适应你的应用程序。