我有一个100行的表,想要以编程方式将其滚动到任何元素并选择该元素。在第一个控制器中,我指定行和部分,并使用UITableView将控制器推入导航堆栈。在“tableView-controller”的viewWillAppear
中,我使用代码:
[tableView_ selectRowAtIndexPath:[NSIndexPath indexPathForRow:row inSection:section] animated:NO scrollPosition:UITableViewScrollPositionMiddle];
奇怪的是,它完美地滚动到99个第一行中的任何一行,第100行被选中,但仍然在可见区域“下方”。我必须手动滚动表格以显示它。
如果我将该代码放在viewDidAppear
中,表格滚动得很好,但是在明显的延迟之后。
我还尝试了什么:
contentInset.bottom
- 工作,但我底部有一个无用的空间。在viewDidAppear
中,像往常一样处理99行,并为第100行设置自定义contentOffset
:
offset.y += tableView_.contentSize.height - tableView_.bounds.size.height + 44;
也工作,但似乎是一种丑陋的方式。
那么,当“tableView-controller”出现时,我应该怎样做才能让我的tableView预先滚动到第100个元素?
更新。 我不使用任何xib或故事板,只是在viewDidLoad中定义视图:
- (void)viewDidLoad {
[super viewDidLoad];
tableView_ = [[UITableView alloc] initWithFrame:self.view.frame style:UITableViewStyleGrouped];
tableView_.dataSource = self;
tableView_.delegate = self;
tableView_.sectionFooterHeight = 0.0f;
self.view = tableView_;
numbers = [NSMutableDictionary dictionary];
numberSectionTitles = [NSMutableArray array];
//... some model initialization
headerView = [[UIView alloc] initWithFrame:(CGRect){0, 0, 320, 60}];
headerView.backgroundColor = [UIColor greenColor];
UILabel *l = [[UILabel alloc] initWithFrame:(CGRect){20, 20, 280, 20}];
l.textColor =[UIColor whiteColor];
l.tag = 121;
[headerView addSubview:l];
}
并在viewDidAppear(脏解决方法)中调整选择
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
int row = _selectedIndex % 10;
int section = (_selectedIndex - row) / 10;
if(row == 9 && section == 9){
CGSize contentSize = tableView_.contentSize;
CGPoint offset = tableView_.contentOffset;
offset.y += tableView_.contentSize.height - tableView_.bounds.size.height + 44;
tableView_.contentOffset = offset;
}
[tableView_ selectRowAtIndexPath:[NSIndexPath indexPathForRow:row inSection:section] animated:NO scrollPosition:UITableViewScrollPositionMiddle];
}
答案 0 :(得分:2)
可能是您的视图高度与tableview不同。你的superview(你要添加你的tableview)应该是相同的。你的最后一行是隐藏的,因为你的视图与你的桌面视图的高度不同,这可能会解决你的问题。
答案 1 :(得分:1)
您可以手动执行此操作:
[_tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:row inSection:section] animated:NO scrollPosition:UITableViewScrollPositionNone];
CGRect rect = [_tableView rectForRowAtIndexPath:[NSIndexPath indexPathForRow:row inSection:section]];
CGFloat offsetY = rect.origin.y+rect.size.height/2-_tableView.frame.size.height/2-_tableView.contentInset.top/2;
if (offsetY < -_tableView.contentInset.top)
offsetY = -_tableView.contentInset.top;
else if (offsetY > _tableView.contentSize.height-_tableView.frame.size.height)
offsetY = _tableView.contentSize.height-_tableView.frame.size.height;
_tableView.contentOffset = CGPointMake(_tableView.contentOffset.x, offsetY);
答案 2 :(得分:0)
if(cell == nil)
如果您在CellforRowatIndexpath中编写了这样的if语句,请删除该特定if语句并继续。那条线导致问题
享受编码