UITableViewCell 中的 UITextField - 添加新单元格
Posted
技术标签:
【中文标题】UITableViewCell 中的 UITextField - 添加新单元格【英文标题】:UITextField in UITableViewCell - adding new cells 【发布时间】:2009-07-28 20:07:58 【问题描述】:我正在尝试在 iPhone 上的照片库中创建一个类似于 YouTube 视频上传器视图的表格视图。
这是基本设置。
我创建了一个包含 UITextField 的自定义 UITableViewCell。在我的表格中显示单元格效果很好,我可以毫无问题地编辑文本。我创建了一个事件挂钩,以便我可以查看文本字段中的文本何时发生更改。
[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]
我想做的就是这个。当用户第一次编辑文本时,我想在当前单元格下方的表格视图中插入一个新单元格(newIndexPath 在正确位置之前计算):
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationBottom];
[self.tableView endUpdates];
问题是当我运行单元格插入代码时,单元格被创建,但文本字段的文本短暂更新,但随后键盘被关闭,文本字段被设置回空字符串。
任何帮助都会很棒!我整天都在为这个问题头疼。
- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section
if (section == 0)
return 2;
else
return self.tags.count;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
...
cell = (SimpleTextFieldTableCell *)[tableView dequeueReusableCellWithIdentifier:tagCellIdentifier];
if (cell == nil)
cell = [[[NSBundle mainBundle] loadNibNamed:@"SimpleTextFieldTableCell" owner:nil options:nil] lastObject];
((SimpleTextFieldTableCell *)cell).textField.delegate = self;
((SimpleTextFieldTableCell *)cell).textField.tag = indexPath.row;
((SimpleTextFieldTableCell *)cell).textField.text = [self.tags objectAtIndex:indexPath.row];
[((SimpleTextFieldTableCell *)cell).textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
- (void)textFieldDidChange:(id)sender
UITextField *textField = sender;
[self.tags replaceObjectAtIndex:textField.tag withObject:textField.text];
if (textField.text.length == 1)
[textField setNeedsDisplay];
[self addTagsCell];
- (void)addTagsCell
NSString *newTag = @"";
[self.tags addObject:newTag];
NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:self.tags.count - 1 inSection:1];
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationBottom];
[self.tableView endUpdates];
【问题讨论】:
如果您注释掉插入,文本字段是否为空白? 不,如果没有插入,文本字段会保留输入的文本。只有在插入单元格时,文本才会消失。 上面的 tagCellIdentifier 设置为“SimpleTextFieldTableCell”,这是我在 Interface Builder 中为单元格设置的标识符。 【参考方案1】:我在这里唯一能想到的是,当您插入一行时,可能会重新加载整个表格视图,如果您没有将单元格正确添加到单元格队列中,它们将不会回到原来的状态,因此由于插入,您看到空单元格,只是一个猜测,希望它有所帮助。
【讨论】:
我正在使用通过界面生成器创建的单元格,因此它不会通过 initWithStyle:reuseIdentifier 运行。会不会是个问题? 我只是仔细检查了一下,我用来使单元格出列的标识符与我在 IB 中分配给单元格的标识符相同。 您是否对所有单元格使用相同的标识符?这会导致问题 我使用了 3 种不同类型的单元格,每种都有自己的标识符。 类型是什么意思?如果你有 20 个单元格,你应该有 20 个不同的标识符【参考方案2】:快速更新:
应该没关系,但我注意到你不需要:
[self.tableView beginUpdates]
[self.tableView endUpdates]
因为您正在执行一项操作。不确定这是否重要(不应该)。
更新:
我应该说这样的问题很常见。这是与您的问题相关的帖子
http://www.bdunagan.com/2008/12/08/uitextview-in-a-uitableview-on-the-iphone/
另外,其他人已将其抽象出来。具体来说,我已经尝试过没有这样的问题:
http://furbo.org/2009/04/30/matt-gallagher-deserves-a-medal/
您可以使用: http://github.com/joehewitt/three20/
但它有一点学习曲线。
另一个解决此问题的 *** 问题:
Editing a UITextField inside a UITableViewCell fails
对不起,我没有直接回答您的问题,但我认为解决方案可能包含在这些链接之一中。
原答案:
试试:
[newTextField setNeedsDisplay];
有时表格视图可能会因更新 UITextView/UITextField 内容而变得“粘滞”。
如果这不起作用,请确保您的支持模型也已正确更新。您没有显示任何代码表明您更新了模型(尽管我假设您这样做了,否则它可能会引发异常)。
【讨论】:
我尝试调用 setNeedsDisplay 无济于事。我将方法实现添加到我的原始帖子中,包括模型更新。 啊,我认为您对 beginUpdates 和 endUpdates 调用是正确的。我认为只有在其中调用了 insert rows 方法时才会出现动画,但看起来这仅适用于插入和删除组。这很奇怪,因为 UITableViewCell 中的 UITextField 本身就可以正常工作。完全没有问题。只是在导致问题的 UITextField 更改事件中插入单元格。有趣的是,您应该提到 Three20。我实际上在这个应用程序的大部分时间里都使用它。有些地方手动创建表格更有意义,这就是其中之一。以上是关于UITableViewCell 中的 UITextField - 添加新单元格的主要内容,如果未能解决你的问题,请参考以下文章
从 UIText 字段的用户输入更改 UIView 框架的高度和宽度
如何从 UITextfields UIMenuController 中删除不需要的 UIMenuItems?