0

我有一个故事板应用程序,它有一些视图控制器需要以编程方式推送到导航堆栈上,而不是使用 segues。我正在使用以下代码来做到这一点:

POCollectionViewController* vc = [self.storyboard instantiateViewControllerWithIdentifier:@"categoryView"];
POCategory* destination = (POCategory*)self.collections[indexPath.row];
[vc setShowingCollection:destination];
[self.navigationController pushViewController:vc animated:YES];

我的问题是,当我使用 segues 推送视图控制器并按下“后退”按钮时,滚动位置被保留,但是当我使用上面的代码并按下“后退”按钮时,我以前的视图控制器会出现滚动顶部的酒吧。

它是否重新实例化应该已经在导航堆栈上的视图控制器?如何保留滚动位置?

编辑 代码setShowingCollection:

-(void)setShowingCollection:(POCategory*)collection
{
    self->showingCollection = collection;
    self.title = collection.name;

    self.HUD = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    self.HUD.delegate = self;
    [self.HUD showWhileExecuting:@selector(buildDisplayItems) onTarget:self withObject:nil animated:YES];
}

buildDisplayItems方法根据显示集合的 ID 从服务器获取一堆数据。

4

2 回答 2

0

我认为您没有正确弹出控制器,您不是弹出到推送的控制器,而是弹出到最新的控制器。您如何在后退按钮中执行弹出控制器?

你应该这样做:

[self.navigationController popViewControllerAnimated:YES];

于 2013-09-15T18:23:51.363 回答
0

我的直接想法是,如果您必须为每个“segue”实例化一个新控制器,则必须保存滚动位置,并且当您重新加载视图时会导致 uiscrollview 滚动。

像这样保存在属性中的东西应该可以解决问题:

CGRect scrolledRect = CGRectMake(scrollView.contentOffset.x, scrollView.contentOffset.y, scrollView.bounds.size.width, scrollView.bounds.size.height);

然后当你重新加载时:

 [scrollView scrollRectToVisible:scrolledRect animated:NO];
于 2013-09-15T18:26:34.987 回答