我需要在初始加载RootController时滚动tableview。问题是我必须等到cellForRowAtIndexPath完成才能使用scrollToRowAtIndexPath做任何事情。 cellForRowAtIndexPath似乎是我加载表后挂钩的最后一个事件。因为视图已经加载,所以表是可见的,因此滚动是可见的。我需要一些方法来使表格加载,滚动和淡入或其他东西不会只是弹出。
目标是在最初显示tableview时让tableview位于第五行。我当然可以这样做,但用户会看到滚动动作。滚动动作是我想要在视图的初始加载时隐藏的。
我有一个类级变量来跟踪cellForRowAtIndexPath中的最后一个索引,所以我没有为每个cellForRowAtIndexPath迭代触发scrollToRowAtIndexPath。
欢迎任何其他有关如何做到这一点的建议。
答案 0 :(得分:2)
尝试在视图控制器中覆盖viewWillAppear并在那里设置视图。在视图初始化之后但在显示之前调用此方法。请注意,每次显示视图时都会调用此方法(包括后退导航或取消模式弹出窗口),因此如果您只想在第一次创建视图时滚动,则可能需要使用标记,如代码示例下方。
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear: animated];
if (!alreadyDisplayed) {
// now scroll to the right row
[self.tableView
scrollToRowAtIndexPath: [NSIndexPath indexPathForRow: 5 inSection: 0]
atScrollPosition: UITableViewScrollPositionTop animated: NO];
alreadyDisplayed = true;
}
}
答案 1 :(得分:1)
在这个领域成为新人我认为这个问题可以像这样轻松解决
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if(!firstTime){
[NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(timerFired:) userInfo:nil repeats:NO];
}
}
- (void) timerFired:(NSTimer *)aTimer{
firstTime = YES;
[aTimer invalidate];
[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:([self.tableView numberOfRowsInSection:0]-1) inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:NO];
}
希望这有帮助。
答案 2 :(得分:0)
我不知道这是不是你想要的,也许我不明白你的意图,但是这里有:
如果它是cellForRow ...你认为你需要挂钩,显然这将被调用几次,你必须知道它最后一次调用它(表视图将调用它所有可见行,可能是视图框外的一行或两行)。在每次调用该方法结束时,触发一个延迟的方法调用(执行blah blah with delay),但是在cellForRow ...方法的开头,取消延迟执行。这种方式,当最后一次为表格单元格加载时调用该方法时,您将对助手方法进行延迟调用,该方法将滚动表格等。
我相信启动myTableView.hidden = YES会有所帮助,滚动完成后会设置为“NO”。问题是隐藏= YES对tableview没有影响。它是一个连接的IBOutlet。
您可能希望在viewWillAppear(或didAppear)中设置一个类属性,以指示是否要进行延迟滚动操作,并在滚动后清除它。