我有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];
}
答案 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类或类似的东西;您可以为自定义表视图单元格或类似的东西创建委托方法。