在 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 无法滚动底部