如何获得已经实例化的UIViewController?

时间:2013-04-26 18:36:16

标签: ios objective-c uiviewcontroller storyboard

我是iOS编程新手,我正在使用ECSlidingViewController创建一个幻灯片菜单(如Facebook)。想象一下,如果我在菜单中引用了两个视图。

当我打开应用程序时,显然会为我的顶视图(我菜单中的第一个)调用viewDidLoad。如果我打开菜单并选择第二个视图,它也会调用viewDidLoad。但是,如果我回到第一个视图,它将再次调用该方法,这是我不想要的。我有一些设置代码,如果可能的话我不想重新实现视图。我见过Facebook并且他们没有重新恢复视图,因为它记得我在我的墙上的滚动位置,例如,当我切换视图并返回后。

这是我选择时触发的委托方法:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Get identifier from selected
    NSString *identifier = [NSString stringWithFormat:@"%@", [self.menu objectAtIndex:indexPath.row]];

    // Add the selected view to the top view
    UIViewController *newTopVC = [self.storyboard instantiateViewControllerWithIdentifier:identifier];

    // Present it 
    [self.slidingViewController anchorTopViewOffScreenTo:ECRight animations:nil onComplete:^{
        CGRect frame = self.slidingViewController.topViewController.view.frame;
        self.slidingViewController.topViewController = newTopVC;
        self.slidingViewController.topViewController.view.frame = frame;
        [self.slidingViewController resetTopView];
    }];
} 

有没有办法以某种方式获得某个VC,如果它已经被创建了?这样,它只会多次调用viewWillAppear而不是viewDidLoad

谢谢。

1 个答案:

答案 0 :(得分:1)

可以使用navigationcontroller。当你想进入第二个视图时,可以将视图控制器推到导航视图控制器上,当你返回时,可以将它从导航控制器中弹出。

编辑:

如果您有3个视图,您仍然可以使用navigationcontroller。与上述逻辑相同。但请记住在navigationcontroller中删除同一viewcontroller的双实例。看看这个页面:How to remove a specific view controller from uinavigationcontroller stack?。检查特定的视图控制器是否存在,如果存在,请删除然后将其推到顶部。