有没有办法在动态 UITableView 上使用 UITextField,并在它们之间使用“选项卡”?
Posted
技术标签:
【中文标题】有没有办法在动态 UITableView 上使用 UITextField,并在它们之间使用“选项卡”?【英文标题】:Is there a way to use UITextField's on a dynamic UITableView, AND 'tab' between them? 【发布时间】:2015-03-14 00:25:51 【问题描述】:这可能有点长,但请耐心等待。它主要是简单的代码和日志输出。通常,如果我想将 UITextField 作为 UITableViewCell 的一部分,我可能会使用 a) 静态行或 b) 我会在情节提要中创建单元格,将单元格输出并将字段输出到我的 ViewController,然后将单元格拖到“表格视图”之外,但将其保留在场景中。
但是,我需要创建一个视图,我可以在其中接受来自 28 种不同事物的输入。我不想输出 28 个不同的 UITextField。
我想动态地执行此操作,以使其更容易。所以我创建了一个带有标签和 UITextField 的自定义 UITableViewCell。
我的 ViewController 有两个数组。
@property (nonatomic, strong) NSArray *items;
@property (nonatomic, strong) NSArray *itemValues;
我的cellForRowAtIndexPath
看起来像这样......
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
NSString *cellIdentifier = @"ItemCell";
MyItemTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
if (!cell)
cell = [[MyItemTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
cell.categoryValue.tag = indexPath.row;
cell.categoryValue.delegate = self;
cell.item.text = [self.items objectAtIndex:indexPath.row];
cell.itemValue.text = [self.itemValues objectAtIndex:indexPath.row];
return cell;
- (BOOL)textFieldShouldReturn:(UITextField *)textField
NSInteger tag = [textField tag];
NSLog(@"TFSR tag: %zd/%zd", tag, self.categories.count-1);
if (tag < (self.categories.count - 1))
NSIndexPath *nextIndex = [NSIndexPath indexPathForRow:tag+1 inSection:0];
NSLog(@"TFSR nextRow: %zd/%zd\n", nextIndex.row);
FFFCategoryTableViewCell *cell = (MyItemTableViewCell *)[self.tableView cellForRowAtIndexPath:nextIndex];
[self.tableView scrollToRowAtIndexPath:nextIndex atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
[cell.categoryValue becomeFirstResponder];
else
NSLog(@"DONE!");
return YES;
这被证明是有问题的。目标是,用户应该能够选择第一行的 UITextField,输入一个值,当他们点击键盘上的“下一步”键时,它们将被发送到第二行的 UITextField。然后是第 3 次、第 4 次、第 27 次、第 28 次。
但是,假设我首先在 IndexPath.row = 11 的单元格上突出显示 UITextField。如果我点击“下一步”,这就是我的输出的样子...
======== OUTPUT ========
TFSR tag: 11/27
TFSR nextRow: 12/27
TFSR tag: 12/27
TFSR nextRow: 13/27
TFSR tag: 13/27
TFSR nextRow: 14/27
TFSR tag: 0/27
TFSR nextRow: 1/27
现在我完全明白为什么会这样了。 UITableView 试图在加载各种单元格时节省内存,并使用 dequeueReusableCellWithIdentifier ......我只有 14 个单元格(0-13)。然后循环回到开头。
我的问题是……我不知道这个问题的解决方案。我希望用户能够在第 28 个 UITextField 行之前进行下一步。
关于如何实现这一目标的任何想法/解决方案?
【问题讨论】:
【参考方案1】:问题在于您对标签的使用。您只需在第一次创建单元格时设置标签。每次调用cellForRowAtIndexPath:
时都需要设置它。你想要:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
NSString *cellIdentifier = @"ItemCell";
MyItemTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
if (!cell)
cell = [[MyItemTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
cell.categoryValue.delegate = self;
cell.categoryValue.tag = indexPath.row;
cell.item.text = [self.items objectAtIndex:indexPath.row];
cell.itemValue.text = [self.itemValues objectAtIndex:indexPath.row];
return cell;
请注意,将标签设置为索引路径仅在行固定时才有效。如果您的表格行更加动态(一些可以添加、删除或重新排序),那么使用索引路径作为标记将失败,必须使用另一种方法。
【讨论】:
以上是关于有没有办法在动态 UITableView 上使用 UITextField,并在它们之间使用“选项卡”?的主要内容,如果未能解决你的问题,请参考以下文章
不使用 AutoLayout 的 UITableView 动态行高
iOS UITableView reloadData 导致键盘收起不能连续输入问题解决办法
如何使用swift在ios中动态/编程添加多个UITableView? [关闭]