在 didselectRowAtIndexPath 之后 UITableView 无法滚动底部

Posted

技术标签:

【中文标题】在 didselectRowAtIndexPath 之后 UITableView 无法滚动底部【英文标题】:UITableView can't scroll bottom after didselectRowAtIndexPath 【发布时间】:2013-12-12 12:42:04 【问题描述】:

我在 iPAD 中有一个 UITableViewController,当我第一次加载 tableview 时,我可以滚动到底部,但是如果使用 didSelectRowAtIndexPath 选择一个单元格,我不能再滚动到底部,tableView 不断反弹,它是一个非常奇怪的行为。我已经放了一些日志来获取所有的框架/边界/内容大小/内容插入/内容偏移。 每次点击表格高度都在增加,我不明白如何解决这个问题。

 if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    
            if ([self.navigationController.parentViewController isKindOfClass:[UISplitViewController class]]) 

            // iPad split view controller support
            UISplitViewController *split = (UISplitViewController *)self.navigationController.parentViewController;

            NSMutableArray *allControllers = [[NSMutableArray alloc] initWithArray:split.viewControllers];
            NSArray *allControllersCopy = [allControllers copy];

            for(int i = 0;i < allControllersCopy.count;i++)
            
                UIViewController *s = [allControllersCopy objectAtIndex:i];
                if ([s isKindOfClass:[UINavigationController class]]) 
                    NSLog(@"UINavigationController at index : %d",i);
                
                NSLog(@"custom split : %@", s.title);

            
            UINavigationController *nav = [split.viewControllers objectAtIndex:1];

            allControllers = [[NSMutableArray alloc] initWithArray:nav.viewControllers];

            for(int i = 0;i < allControllers.count;i++)
            
                UIViewController *s = [allControllers objectAtIndex:i];
                if(![s isKindOfClass:[MVPTaskViewController class]])
                
                    [nav popViewControllerAnimated:NO];

                
            
            self.nTaskViewController = [nav.viewControllers objectAtIndex:0];
            self.nTaskViewController.selectedTask = selectedTask;
            [self.nTaskViewController updateTask:self.nTaskViewController.selectedTask];

            NSIndexPath *cellAtIndexPath = [NSIndexPath indexPathForRow:indexPath.row inSection:indexPath.section];
            [self.tableView scrollToRowAtIndexPath:cellAtIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];

            NSLog(@"tableView frame height %f",self.tableView.frame.size.height);
            NSLog(@"tableView frame width %f",self.tableView.frame.size.width);

            NSLog(@"tableView contentSize height %f",self.tableView.contentSize.height);
            NSLog(@"tableView contentSize width %f",self.tableView.contentSize.width);

            NSLog(@"tableView content offset x %f - y %f",self.tableView.contentOffset.x, self.tableView.contentOffset.y);

        

这是我得到的日志:

2013-12-12 12:33:47.854 moveplanner[7604:70b] view will appear
2013-12-12 12:33:47.854 moveplanner[7604:70b] tableView frame height 648.000000
2013-12-12 12:33:47.854 moveplanner[7604:70b] tableView frame width 320.000000
2013-12-12 12:33:47.855 moveplanner[7604:70b] tableView contentSize height 2313.058105
2013-12-12 12:33:47.856 moveplanner[7604:70b] tableView contentSize width 320.000000
2013-12-12 12:33:47.856 moveplanner[7604:70b] tableView content offset x 0.000000 - y 0.000000

2013-12-12 12:33:47.934 moveplanner[7604:70b] viewDidAppear details
2013-12-12 12:33:55.470 moveplanner[7604:70b] UPDATE TASK
2013-12-12 12:33:55.471 moveplanner[7604:70b] SELECTED TASK : Switch home insurance
2013-12-12 12:33:55.494 moveplanner[7604:70b] tableView frame height 808.000000
2013-12-12 12:33:55.495 moveplanner[7604:70b] tableView frame width 320.000000
2013-12-12 12:33:55.496 moveplanner[7604:70b] tableView contentSize height 2313.058105
2013-12-12 12:33:55.496 moveplanner[7604:70b] tableView contentSize width 320.000000
2013-12-12 12:33:55.496 moveplanner[7604:70b] tableView content offset x 0.000000 - y 0.000000
First click on a cell

2013-12-12 12:33:57.546 moveplanner[7604:70b] UPDATE TASK
2013-12-12 12:33:57.546 moveplanner[7604:70b] SELECTED TASK : Recycle unwanted items
2013-12-12 12:33:57.547 moveplanner[7604:70b] tableView frame height 968.000000
2013-12-12 12:33:57.548 moveplanner[7604:70b] tableView frame width 320.000000
2013-12-12 12:33:57.549 moveplanner[7604:70b] tableView contentSize height 2313.058105
2013-12-12 12:33:57.549 moveplanner[7604:70b] tableView contentSize width 320.000000
2013-12-12 12:33:57.549 moveplanner[7604:70b] tableView content offset x 0.000000 - y 317.000000


Second click on a cell

2013-12-12 12:34:00.448 moveplanner[7604:70b] UPDATE TASK
2013-12-12 12:34:00.448 moveplanner[7604:70b] SELECTED TASK : Gas boiler service
2013-12-12 12:34:00.449 moveplanner[7604:70b] tableView frame height 1128.000000
2013-12-12 12:34:00.450 moveplanner[7604:70b] tableView frame width 320.000000
2013-12-12 12:34:00.451 moveplanner[7604:70b] tableView contentSize height 2313.058105
2013-12-12 12:34:00.451 moveplanner[7604:70b] tableView contentSize width 320.000000
2013-12-12 12:34:00.451 moveplanner[7604:70b] tableView content offset x -0.000000 - y 1185.000000

Third click on a cell

2013-12-12 12:34:09.852 moveplanner[7604:70b] UPDATE TASK
2013-12-12 12:34:09.852 moveplanner[7604:70b] SELECTED TASK : Change the locks 
2013-12-12 12:34:09.853 moveplanner[7604:70b] tableView frame height 1288.000000
2013-12-12 12:34:09.854 moveplanner[7604:70b] tableView frame width 320.000000
2013-12-12 12:34:09.854 moveplanner[7604:70b] tableView contentSize height 2313.058105
2013-12-12 12:34:09.855 moveplanner[7604:70b] tableView contentSize width 320.000000
2013-12-12 12:34:09.855 moveplanner[7604:70b] tableView content offset x -0.000000 - y 1025.000000

【问题讨论】:

【参考方案1】:
    [self.tableView scrollToRowAtIndexPath:cellAtIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

可能是罪魁祸首。

【讨论】:

我已经试过了,还是不行。问题是第一次点击单元格后,uitableview的高度变了,看不到list的bootom,如果我尝试滚动我被反弹回来【参考方案2】:

我找到了解决方案。我不知道这是否是解决问题的正确方法,但它确实有效。

我在NSIndexPath *cellAtIndexPath = [NSIndexPath indexPathForRow:indexPath.row inSection:indexPath.section];[self.tableView scrollToRowAtIndexPath:cellAtIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];之后添加了didSelectRowAtIndexPath

                CGRect tbFrame = [self.tableView frame];
                if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation))
                
                    tbFrame.size.height = 910;                    
                else 
                     tbFrame.size.height = 655;

                
[self.tableView setFrame:tbFrame];

希望能帮到别人

【讨论】:

以上是关于在 didselectRowAtIndexPath 之后 UITableView 无法滚动底部的主要内容,如果未能解决你的问题,请参考以下文章

tableView - didSelectRowAtIndexPath 未调用

在 didSelectRowAtIndexPath 中呈现缓慢的 ViewController

我可以麻烦UITableViewDelegate的didSelectRowAtIndexPath:吗?

在 didselectRowAtIndexPath 之后 UITableView 无法滚动底部

在 tableView 上使用 CustomCell,如何调用 didSelectRowAtIndexPath?

didSelectRowAtIndexPath 不会在 ViewController 中触发