【问题标题】:Switching from View Controller in stack to View Controller not on stack从堆栈中的视图控制器切换到不在堆栈中的视图控制器
【发布时间】:2011-12-08 05:06:10
【问题描述】:

我希望你能帮助我。我设计了一个标签栏应用程序。在第一个选项卡的视图控制器中,有一个按钮,当按下该按钮时,会生成一个模式视图。我已经在该模态视图上初始化了一个导航控制器,因为当我点击我的模态视图(我用来输入用户数据)上的“保存”按钮时,我推送另一个表视图(它显示了所有用户输入数据的表至今)。在那个堆叠的表格视图上,我有一个“完成”按钮,当按下它时,它应该转到选项卡上的另一个视图(用户输入的进度视图),即关闭堆栈。

所以我的问题是,如果我是堆栈中的两个控制器,如何将堆栈弹出到不在堆栈上的另一个视图?我使用了popToViewController 方法,但正如您可能已经猜到的那样,我收到“试图弹出到不存在的视图控制器”消息。这是我在堆栈的第二个视图中的简单代码:

- (IBAction)doneButtonPressed:(id)sender 
{
    LogTableViewController *logTableViewController = [[LogTableViewController alloc]init]; 

    [self.navigationController popToViewController:logTableViewController animated:YES];

    [logTableViewController release];
}

LogTableViewController 不在堆栈中,而只是应用程序中另一个选项卡的另一个目标。有任何想法吗?提前致谢。

【问题讨论】:

    标签: iphone ios4 uinavigationcontroller xcode4.2


    【解决方案1】:

    我不完全确定为什么你不能将新的视图控制器推送到堆栈,但如果你需要弹出它,你可以这样做:

        //create new VC
    LogTableViewController *newVC = [[LogTableViewController alloc]init];;
    
    //get VC stack
    NSMutableArray * newControllers = [NSMutableArray arrayWithArray: self.navigationController.viewControllers];
    
    //choose where to insert the new vc
    NSUInteger insert_index = [newControllers count] - 1;
    
    //insert into the stack
    [newControllers insertObject:newVC atIndex:insert_index];
    
    //replace stacks
    [self.navigationController setViewControllers: newControllers];
    
    //pop to your new controller
    [self.navigationController popViewControllerAnimated:YES];
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      你很亲密。做吧:

      - (IBAction)doneButtonPressed:(id)sender 
      {
          LogTableViewController *logTableViewController = [[LogTableViewController alloc]init]; 
      
          [self.navigationController setViewControllers:[NSArray arrayWithObject:logTableViewController] animated:YES];
      
          [logTableViewController release];
      }
      

      【讨论】:

      • 这将从堆栈中删除所有其他视图控制器,如果它们没有被保留,可能会释放它们!而不是用只包含一个视图的新表替换所有视图控制器 - 将一个添加到表中,然后进行导航。
      • 是的,确实如此。是否要保留它们取决于他。他正在尝试做的事情,如果它按他的意图工作,就会将它们从堆栈中弹出并(大概)将他的新堆栈推上。当然不是这样,但是-setViewControllers:animated: 可以。
      • 谢谢!做到了。我感谢您的帮助。很高兴知道我很接近,但我永远不会自己想出这个。唯一的问题是,一旦我进入那个新视图,标签栏不在底部。关于如何在显示 LogTableView 的情况下进入原始标签栏的任何想法?
      • 您没有使用UITabBarController 作为您的根视图控制器吗?这可能会为您省去很多麻烦。否则,您将需要使用您的应用程序委托(因为它是您的中心对象)维护对您的 UITabBar 的引用,以便任何对象或视图控制器都可以访问。或者,将“UINavigationController”子类化并管理它。另外,请务必将您的问题标记为已回答。
      • 是的,我的标签栏是应用程序的根控制器。这是代码: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 应用程序启动后自定义的覆盖点。 logViewController.managedObjectContext = self.managedObjectContext; self.window.rootViewController = self.tabBarController; [self.window makeKeyAndVisible];返回是;在 .h 文件中使用 IBOutlet UITabBarController。是的,我想我也理解这一点——我确实需要其他视图和堆栈可以访问该选项卡栏。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 2012-05-04
      • 1970-01-01
      • 2012-08-11
      • 2016-12-11
      相关资源
      最近更新 更多