iOS:当切换回非编辑状态时(由于键盘原因更改contentinset后),表视图中的单元格行为异常

iOS:当切换回非编辑状态时(由于键盘原因更改contentinset后),表视图中的单元格行为异常,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我有一些自定义视图,其中嵌入了表视图。因此,当键盘出现时,我必须对整个向上滚动等操作进行编程。我使用了苹果的文档,并得出了以下结论: - (void)viewDidLoad { [super viewDidLoad]; NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; [center addObserver:self selector:@selector(keyboardDidShow

我有一些自定义视图,其中嵌入了表视图。因此,当键盘出现时,我必须对整个向上滚动等操作进行编程。我使用了苹果的文档,并得出了以下结论:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
    [center addObserver:self selector:@selector(keyboardDidShow:)
                   name:UIKeyboardDidShowNotification object:nil];
    [center addObserver:self selector:@selector(keyboardWillHide:)
                   name:UIKeyboardWillHideNotification object:nil];

}

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)keyboardDidShow:(NSNotification *)notification
{
    // keyboard frame is in window coordinates
    NSDictionary *userInfo = [notification userInfo];
    CGRect keyboardFrame = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];

    // convert own frame to window coordinates, frame is in superview's coordinates
    CGRect ownFrame = [self.tableView.window convertRect:self.tableView.frame fromView:self.tableView.superview];

    // calculate the area of own frame that is covered by keyboard
    CGRect coveredFrame = CGRectIntersection(ownFrame, keyboardFrame);

    // now this might be rotated, so convert it back
    coveredFrame = [self.tableView.window convertRect:coveredFrame toView:self.tableView.superview];

    // set inset to make up for covered array at bottom
    self.tableView.contentInset = UIEdgeInsetsMake(0, 0, coveredFrame.size.height, 0);
    self.tableView.scrollIndicatorInsets = self.tableView.contentInset;
}

- (void)keyboardWillHide:(NSNotification *)notification
{
    self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);
    self.tableView.scrollIndicatorInsets = self.tableView.contentInset;
}
但现在不太好的地方是(我尝试过的另一个代码,结果相同):当在表格周围滚动并切换回非编辑模式时,一些之前隐藏在表格底部的单元格立即处于非编辑模式,而不是从缩进状态转换回缩进状态。即使出现错误,也很少会导致一个单元格保持编辑模式,即使所有单元格都已切换回。如果我将单元格来回滚动,并且格式正确,此错误就会消失


知道为什么吗?我肯定把范围缩小到这个代码。当我注释所有内容时,它会正常工作(当然,当键盘出现时不会滚动:-)

这听起来像是一个单元格出列问题。tableview根据屏幕上的可见性加载单元格。也许代码中的rect移位会让人困惑。在关闭编辑模式时尝试更新tableview。是否仅在结束编辑模式时更新?用什么方法调用[self.tableView reloadData]?是的;试试看。如果这解决了问题,问题是你的tableview处理,而不是你的rect代码。不工作抱歉。苹果的滚动实现也不起作用。只有当某些单元格隐藏在固定的“标题”后面,并在编辑结束后重新出现时,才会发生这种情况。我真的不知道如何解决这个问题:-(