【问题标题】:How to dismiss a collection of UIViewController objects that were loaded dynamically in Xcode 4如何关闭在 Xcode 4 中动态加载的 UIViewController 对象的集合
【发布时间】:2012-03-08 06:16:31
【问题描述】:

我在关闭 UIViewController 对象集合时遇到了一些问题。我不知道有一种优雅的方法可以一次关闭所有加载的模式 UIViewController 对象。

我使用 Xcode 4 中的“故事板”,但我不使用 Segues 来映射屏幕。我使用动态代码,如下所示:

一切从 MainViewController.m 开始。我加载 [myMenuController] (菜单列表)。当用户从菜单中选择一个选项时,它会加载 [myTicketController]。在那里进行一些用户交互后,它会加载 [myNextController] 并且您会看到该模式。我动态加载了几个 UIViewControllers(这里没有 segues):

//from MainViewController.m - Load the main menu
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
myMenuController = (MyMenuController *)[storyboard instantiateViewControllerWithIdentifier:@"MyMenuController"];
myMenuController.settingsModel = settingsModel;
myMenuController.ticketStatusHandler = data;
myMenuController.rootDataModel = dataModel;
[myMenuController setModalPresentationStyle:UIModalPresentationFullScreen];    
[self dismissModalViewControllerAnimated:NO];
[self presentModalViewController:myMenuController animated:YES];


///////////////////////////////////////////////////////////////////////////


//from MyMenuController.m - Load the add ticket menu
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
myTicketController = (MyTicketController *)[storyboard instantiateViewControllerWithIdentifier:@"MyTicketController"];
myTicketController.settingsModel = settingsModel;
myTicketController.ticketStatusHandler = data;
myTicketController.rootDataModel = dataModel;
[myTicketController setModalPresentationStyle:UIModalPresentationFullScreen];    
[self dismissModalViewControllerAnimated:NO];
[self presentModalViewController:myTicketController animated:YES];


///////////////////////////////////////////////////////////////////////////////

//from MyTicketController.m - Load the next screen
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
myNextController = (MyNextController *)[storyboard instantiateViewControllerWithIdentifier:@"MyNextController"];
myNextController.settingsModel = settingsModel;
myNextController.rootDataModel = dataModel;
[myNextController setModalPresentationStyle:UIModalPresentationFullScreen];    
[self dismissModalViewControllerAnimated:NO];
[self presentModalViewController: myNextController animated:YES];

所以我到了应用程序的末尾并加载了更多的 UIViewControllers。假设我在加载 [myNextController] 之后再加载 4 或 5 个 UIViewController。

有没有一种通用的方法来卸载内存中的所有 UIViewController,然后简单地重新加载 [myMenuController]?

【问题讨论】:

  • 因为我不太确定我的答案,而且我不在我的 Mac 上,所以我将在这里发表评论。如何在每个控制器上放置标签,然后在一个方法中检查这些控制器是否处于活动状态,然后简单地关闭它。
  • 听起来很酷,就像我正在寻找的一样。但我不知道该怎么做。这是我的第一个 iPhone 应用程序。
  • 据我所知,您可以使用 [self.yourView setTag:1] 设置标签并使用 (UIView *)[self.parentView viewWithTag:1] 指向带有标签的对象: 1 在父视图中。但同样,我建议您自己尝试一下,然后环顾四周
  • 我是在加载 UIViewControllers 时设置标签(如上面的示例),还是在它们的类构造中设置标签?
  • 啊,对不起,devtron,好像我给你一个错误的答案,我不认为你可以在 UIViewController 上设置标签,你可以设置标签的是 UIView

标签: iphone xcode4 uiviewcontroller uistoryboard


【解决方案1】:

例如,您可以在应用程序委托中定义一个全局数组并将视图控制器插入其中。一旦您想要关闭所有视图控制器,请创建一个 for 循环来关闭其中的所有对象(视图控制器), ,如果你想加载它,你也可以在特定索引中插入一个视图控制器

  1. 插入[appDelegate.controllersArr insertObject:self atIndex:0];

  2. 卸载所有视图控制器

        for(int i=0;i<[appDelegate.controllersArr count];i++)
    {           
        [[appDelegate.controllersArr objectAtIndex:i] dismissModalViewControllerAnimated:NO];
    }
    

我希望这会有所帮助......祝你好运。

【讨论】:

  • 如何在应用委托中定义数组?该语法是什么样的?
  • 喜欢在任何类上定义任何数组!在你声明它的接口中创建一个属性,合成 .. 并且因为你可以访问任何类上的应用程序委托,所以你可以访问数组。
  • 让我们假设应用程序委托类名称是 AppDelegate .. 将 AppDelegate.h 导入您要在其上定义的类.. 然后您编写 AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
  • 当我尝试删除所有模态视图控制器(使用你的循环)时,我的数组是空的。没有向数组中添加任何内容。你能解释一下如何更好地插入,以及 appDelegate 数组的生命周期吗?这究竟是如何通过 AppDelegate 工作的?
  • ok .. 您将插入要保留在索引 0 中的视图控制器,就像我在上面第一点中的示例一样.. 当您进行 for 循环时,使 i 的初始值相等到 1 .. 这样将关闭除索引 0 处的视图控制器之外的所有视图控制器,这就是你想要的吗?
【解决方案2】:

如果您希望它们被“卸载”(我假设您的意思是解除分配),您只需要确保没有对它们的引用。因此,您需要解除它们(您似乎已经在这样做),并且您需要重置任何引用它们的变量,例如在MyMenuController 中你需要在完成myTicketController 后执行此操作:

[myTicketController release]; // if not using ARC
myTicketController = nil;  // if using ARC

【讨论】:

  • 这并没有真正解释如何关闭所有加载的控制器。
猜你喜欢
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
相关资源
最近更新 更多