Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS动态表单在UITableViewCells中,检索值_Ios_Iphone_Forms_Uitableview_Dynamic - Fatal编程技术网

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

iOS动态表单在UITableViewCells中,检索值,ios,iphone,forms,uitableview,dynamic,Ios,Iphone,Forms,Uitableview,Dynamic,我一直在搜索和阅读,但找不到任何结论性的方法来实现我想要的,并希望在这里找到帮助 我有一个UITableView,它允许用户将多种口味和百分比添加到配方中。我已经实现了使用自定义单元格/笔尖添加或删除香料行的方法,效果非常好 我现在面临的问题是如何检索用户为每个添加行提供的值 (为清晰起见进行编辑:我的问题不是填充数据,而是动态读取所有数据以便保存) 我确实设法获得了可见行的值(我确实了解Reuseidentifier和Tableview是如何工作的,就其本身而言,为了内存管理,iOS只跟踪可见

我一直在搜索和阅读,但找不到任何结论性的方法来实现我想要的,并希望在这里找到帮助

我有一个UITableView,它允许用户将多种口味和百分比添加到配方中。我已经实现了使用自定义单元格/笔尖添加或删除香料行的方法,效果非常好

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

(为清晰起见进行编辑:我的问题不是填充数据,而是动态读取所有数据以便保存)

我确实设法获得了可见行的值(我确实了解Reuseidentifier和Tableview是如何工作的,就其本身而言,为了内存管理,iOS只跟踪可见行),但不跟踪隐藏行

理论上,我假设我必须在维护所有单元格的“cellForRowAtIndexPath”之外创建一个单元格数组。但是,我面临另一个概念性问题,我的定制笔尖/单元格没有显示。。。。基本上:

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

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