在UITableView中为单元格调出键盘?

时间:2009-08-04 03:34:18

标签: iphone uitableview

我有UITableView,其中包含代表播放器的自定义单元格。添加新播放器时,会添加新数据项并调用[UITableView reloadData]。单元格的一部分是包含播放器名称的UITextView。如何为它调出键盘?

如果我可以访问单元格中的UITextView但是它还没有实际创建,我可以使用becomeFirstResponder。因为reloadData实际上还没有执行新单元的创建。

其他人必须先解决这个问题。任何有关如何使这项工作的提示将不胜感激。

我的代码段:

-(IBAction)addPlayerPressed:(id)sender {
Player *newPlayer = [Player alloc];
[players addObject:newPlayer];
[table reloadData];

// Scroll to bottom showing the new player location
NSIndexPath *scrollIndexPath = [NSIndexPath indexPathForRow:([players count] - 1) inSection:0];
[table scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

// cell is always nil  :(
PlayerTableCell *cell = (PlayerTableCell *)[table cellForRowAtIndexPath:scrollIndexPath]
[cell.nameField setfirstResponder];
}

3 个答案:

答案 0 :(得分:2)

一些事情:

使用 UITextField 代替UITextView可能会更好。 UITextField非常适合您在此处描述的单行条目。

至于你的解决方案,这是我推荐的。 (也冒昧清理你的记忆管理)

将一个BOOL属性添加到您的Player类,名为'needsKeyboardDisplay',然后在创建新实例后将其设置为yes。

-(IBAction)addPlayerPressed:(id)sender {
Player *newPlayer = [[Player alloc] init];


newPlayer.needsKeyboardDisplay = YES;


[players addObject:newPlayer];

[newPlayer release];

[table reloadData];

// Scroll to bottom showing the new player location

NSIndexPath *scrollIndexPath = [NSIndexPath indexPathForRow:([players count] - 1) inSection:0];

[table scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];


}

然后,在cellForRowAtIndexPath中,在您设置单元格之后插入:

Player *playerForCell = [players objectAtIndex:indexPath.row]; 

if (playerForCell.needsKeyboardDisplay)
{
[nameField becomeFirstResponder];
playerForCell.needsKeyboardDisplay = NO;
}

所有这一切,从用户体验的角度来看,用于编辑像这样的长项列表中的详细信息的(某种程度上)标准iPhone体验是在另一个视图中执行。当然,这取决于你。

答案 1 :(得分:0)

你可以让textfields委托UITableviewController代替表格单元吗?

答案 2 :(得分:0)

在你的PlayerTableCell类中,你可以在-initWithStyle:reuseIdentifier:方法中放入一些代码来检查它是否应该成为第一响应者,如果是,那么。你可能有一个PlayerController类或类似的东西;您可以为自定义表视图单元格或类似的东西创建委托方法。