gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:02:48 28 4
gpt4 key购买 nike

我一直在搜索和阅读所有内容,但找不到任何决定性的方法来实现我想要的,希望能在这里找到帮助...

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

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

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

我确实设法获取可见行的值(我确实了解 Reuseidentifier 和 Tableview 的工作原理,从本质上讲,出于内存管理的考虑,iOS 仅跟踪可见行),但不了解隐藏行。

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

  • 然后如何在不使用 dequeingidentifier 的情况下使用/注册 nib
  • 或者一般来说,我怎样才能解决整个问题才能读取所有用户输入的每行值

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 天的搜索,我终于想出了一个可靠的解决方案。如果有人使用 tableview 遇到同样的动态表单问题,这里是解决方案:

据我们了解,无论在 cellForRowAtIndexPath 中创建什么单元格,它只会在显示时一直存在。一旦滚动并且单元格消失,它就会自动从内存中抛出。这种行为使得无法在稍后阶段遍历所有单元格。

要使其正常工作,请遵循以下步骤:

准备

  • 创建一个 NSObject,其中包含您希望保留在一个表单单元格 (-> cellObject) 中的所有属性
  • 在 Controller 的 ViewDidLoad 中创建一个 NSMutableArray,它将包含 cellObjects (-cellsArray)
  • 向 cellArray 添加您最初希望在 Tableview 中显示的尽可能多的 cellObject
  • 在 numberOfRowsInSection 中返回 cellArray 的数量
  • 在 cellForRowAtIndexPath 中像往常一样构建您的单元格,但向单元格中的每个文本字段添加一个文本字段委托(delegate)(自身)

TextField 委托(delegate)

实现:

 - (void)textFieldDidEndEditing:(UITextField *)textField

并在每次文本字段结束编辑时更新您的 cellArray 对象。本身,获取该行的 cellObject 并使用 TextField 的值编辑属性

添加行

当您添加一行时,只需将一个空的 cellObject 添加到您的 cellsArray 并在您的 tableView 上使用 beginUpdates/insertRowsAtIndexPaths/endUpdates(不要重新加载数据,因为已经输入的数据会丢失)。还要在 addRow 方法的最开头添加以下内容,因为您要确保如果用户在编辑文本字段时添加一行,后者也会被保留:

 [self.view.window endEditing: YES];

删除行

与 Add Row 相同,只是相反,从 cellArray 中删除 cellObject 并在 tableView 上使用 deleteRowsAtIndexPaths

保存数据

技巧来了:由于您应该始终在字段结束编辑模式时保存数据,因此您需要考虑一种情况:如果用户在焦点设置在一个 TextField 上时按下“保存”怎么办?那么在保存操作的开头插入以下内容:

 [self.view.window endEditing: YES];

这确保最后一次为当前文本字段触发 textFieldEndEditing,并且它的数据也将被持久化。

最后遍历你的 cellArray 并用它做任何你想做的事(验证、保存等)...

就是这样,希望这可以帮助其他人,因为我在其他任何地方都找不到任何有值(value)的解释...

关于UITableViewCells 中的 iOS 动态表单,检索值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27315466/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com