每次将视图控制器压入堆栈时,如何从 appDelegate 重新加载视图控制器?

Posted

技术标签:

【中文标题】每次将视图控制器压入堆栈时,如何从 appDelegate 重新加载视图控制器?【英文标题】:How can I reload view controllers from the appDelegate each time I push one on the stack? 【发布时间】:2011-01-09 14:36:16 【问题描述】:

目前我的应用程序只有一个导航屏幕,允许用户选择其他视图。单击 navController 时,只需推送相关的特定视图控制器。如果我再也不会回到相同的视图并期望它被重新加载,这将非常有用。

在下面的代码中,我会在请求时推送一个视图控制器。

- (void)optionClicked:(NSString *)optionName

  if ([@"First" isEqualToString:optionName]) 
    [navController pushViewController:firstController animated:YES];
   else if ([@"Next" isEqualToString:optionName]) 
    [navController pushViewController:nextController animated:YES];
  

完成视图后,我只需将其从堆栈中弹出即可。但是下次用户从菜单中选择相同的选项时,它不会加载“干净”,这就是我的问题所在。如何在每次将视图控制器推送到堆栈时加载新的视图控制器?

【问题讨论】:

【参考方案1】:

您必须重新初始化视图控制器。

  if ([@"First" isEqualToString:optionName]) 
    if (firstController) 
     [firstController release];  // assuming you've got a retain on it.
    firstController = [[MyViewControllerSubclass alloc] init];
    [navController pushViewController:firstController animated:YES];
   

在这种情况下,我建议使用带有保留的属性。 @property (nonatomic, retain) MyViewControllerSubclass *firstController;

这样你就可以使用self.firstController = [[[MyViewControllerSubclass alloc] init] autorelease]; 并且内存管理主要是为你完成的。 (虽然你仍然需要在 dealloc 中释放。)

【讨论】:

在我添加了你提到的属性(非原子,保留)之后 - 我应该把 self.在 firstController 前面?或者只是当我按照你的说明初始化它时? 如果您正在访问属性,请始终使用 self infront。因为如果你使用@synthesize firstController = _firstController 之类的东西,那么该属性的支持 ivar 将是 _firstController 而不是 firstController;这反过来意味着没有 self 的 firstController 将是一个无效的引用。 我还在应用程序委托本身上存储值,每个视图控制器都会在执行操作之前向 appDel 询问此信息 - 我是否需要在发布/初始化后再次在代码中连接关系工作吗? 顺便说一句,如果您知道为保留属性自动生成的访问器代码是什么,这一切都是有意义的。见iphonedevsdk.com/forum/iphone-sdk-tutorials/… 是的,您必须“重新连接”。一般来说,您不应该从应用程序委托中“获取”值,尽管它们应该被“推送”到视图控制器。这通常通过在视图控制器上创建属性然后从应用程序委托设置它们来完成

以上是关于每次将视图控制器压入堆栈时,如何从 appDelegate 重新加载视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

如何从堆栈中弹出视图控制器而不导航到它们

使用后如何在堆栈中删除 UINavigationController 的第一个视图?

当特定 ViewController 类被推入另一个选项卡中的堆栈时,如何从堆栈中弹出视图控制器?

从导航堆栈中弹出视图控制器时从右侧滑入

为啥从导航堆栈中弹出视图时键盘不显示?

如何从导航堆栈中的任何位置弹出到任意视图控制器