Objective c 每次在堆栈上推一个视图控制器时,如何从appDelegate重新加载视图控制器?

Objective c 每次在堆栈上推一个视图控制器时,如何从appDelegate重新加载视图控制器?,objective-c,uinavigationcontroller,Objective C,Uinavigationcontroller,目前,我的应用程序只有一个导航屏幕,允许用户选择其他视图。单击navController时,只需推送相关的特定视图控制器。如果我再也不会回到同一个视图,期待它被重新加载,那么这将非常有用 在下面的代码中,我在请求时按下视图控制器 - (void)optionClicked:(NSString *)optionName { if ([@"First" isEqualToString:optionName]) { [navController pushViewController:fir

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

在下面的代码中,我在请求时按下视图控制器

- (void)optionClicked:(NSString *)optionName
{
  if ([@"First" isEqualToString:optionName]) {
    [navController pushViewController:firstController animated:YES];
  } else if ([@"Next" isEqualToString:optionName]) {
    [navController pushViewController:nextController animated:YES];
  }
}

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

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

  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];
  } 
在这种情况下,我建议使用带有retain的属性<代码>@property(非原子,保留)MyViewControllerSubclass*firstController


这样您就可以使用self.firstController=[[MyViewControllerSubclass alloc]init]autorelease]和内存管理主要是为您完成的。(尽管您仍然必须在dealloc中释放。)

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