我一直在使用一个表格视图,它允许用户在点击最后一个单元格“添加新项目”单元格时插入新数据。每个单元格内部都有一些文本字段,当其中一个成为第一响应者时,当然会出现键盘。我决定使用以下链接中的代码来动态调整 tableview 的大小,以防止键盘覆盖正在编辑的单元格。
每次我点击之前添加的单元格中的任何文本字段时,这段代码都能完美运行,但是当我添加一个新单元格并以编程方式将其中的文本字段设置为第一响应者时,tableView 不会调整大小。我不是objective-c的专家,我真的不知道它出了什么问题。我将不胜感激任何帮助。
这是旨在添加新单元格的代码。
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if(indexPath.section == self.dataController.countOfBudgetItemList)
{
BudgetItem *newItem = [[BudgetItem alloc] initWithName:@"Name of item" price:0 quantity:1 quantityUnit:quantityUnitUnits discount:0 thumbnail:nil];
[self.dataController addBudgetItemListObject:newItem];
[CATransaction begin];
[tableView beginUpdates];
[CATransaction setCompletionBlock:
^{
if(addingNewItem && indexPath.section == editingSectionNumber)
{
SectionTitleCell *addingNewItemTempCell = (SectionTitleCell *)[tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:editingSectionNumber]];
[addingNewItemTempCell.productNameTextField becomeFirstResponder];
}
}];
if(editingSectionNumber >= 0)
{
[tableView reloadSections:[NSIndexSet indexSetWithIndex:editingSectionNumber] withRowAnimation:UITableViewRowAnimationFade];
}
addingNewItem = YES;
editingSectionNumber = indexPath.section;
[tableView insertSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationFade];
[tableView endUpdates];
[CATransaction commit];
}
...
...
...
}
管理tableView中section数量和每行section数量的方法
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if(editingSectionNumber == section)
{
return 2;
}
else
{
return 1;
}
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return self.dataController.countOfBudgetItemList + 1;
}
我也在使用 textFieldDidBeginEditing 方法,所以我不知道这是否会导致任何问题,因为触发它的事件和 keyboardWillShow 方法是相同的。
更新:
我修改了 animateWithDuration 方法调用以显示动画前后的 tableView.frame 的值,我发现该值在“动画”块中已正确修改,但动画完成后它会返回其原始值。为什么框架会变回原来的大小?
[UIView animateWithDuration:animationDuration delay:delay options:UIViewAnimationOptionBeginFromCurrentState
animations:
^{
tableView.frame = tableFrame;
NSLog(@"Origin: x=%f, y=%f", tableView.frame.origin.x, tableView.frame.origin.y);
NSLog(@"Size: width=%f, height=%f", tableView.frame.size.width, tableView.frame.size.height);
[self tableAnimationBegan];
}
completion:^(BOOL finished)
{
if(finished)
{
//self.budgetItemsTableView.scrollEnabled = NO;
NSLog(@"Origin: x=%f, y=%f", tableView.frame.origin.x, tableView.frame.origin.y);
NSLog(@"Size: width=%f, height=%f", tableView.frame.size.width, tableView.frame.size.height);
}
}];