在没有用户注意的情况下滚动tableview

时间:2009-12-18 14:53:16

标签: iphone cocoa-touch uitableview

我需要在初始加载RootController时滚动tableview。问题是我必须等到cellForRowAtIndexPath完成才能使用scrollToRowAtIndexPath做任何事情。 cellForRowAtIndexPath似乎是我加载表后挂钩的最后一个事件。因为视图已经加载,所以表是可见的,因此滚动是可见的。我需要一些方法来使表格加载,滚动和淡入或其他东西不会只是弹出。

目标是在最初显示tableview时让tableview位于第五行。我当然可以这样做,但用户会看到滚动动作。滚动动作是我想要在视图的初始加载时隐藏的。

我有一个类级变量来跟踪cellForRowAtIndexPath中的最后一个索引,所以我没有为每个cellForRowAtIndexPath迭代触发scrollToRowAtIndexPath。

欢迎任何其他有关如何做到这一点的建议。

3 个答案:

答案 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)中设置一个类属性,以指示是否要进行延迟滚动操作,并在滚动后清除它。