insertSections无效后,UITableView键盘调整大小

时间:2013-05-12 07:39:20

标签: objective-c uitableview keyboard resize textfield

我一直在使用表格视图,允许用户在点击最后一个单元格“添加新项目”单元格时插入新数据。每个单元格内部都有一些文本字段,当其中一个成为第一个响应者时,当然键盘会显示出来。我决定使用以下链接中的代码动态调整tableview的大小,以防止键盘覆盖正在编辑的单元格。

Generic UITableView keyboard resizing algorithm

每次点击之前添加的单元格中的任何文本字段时,此代码都能正常工作,但是当我添加新单元格并以编程方式将其中的文本字段设置为第一个响应程序时,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中节数的方法和每行中节的数量

-(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);
            }
        }];

1 个答案:

答案 0 :(得分:0)

好吧,我终于找到了我的问题的解决方案,所以我决定发布在这里以防有人正在经历同样的事情。

基本上所有的代码都完美地期望我使用autolayout,我禁用它,现在一切都像魅力一样。

显然,当我以编程方式添加新单元时,tableview正在自动调整大小,使得它看起来像我的代码完全没有做任何事情。