Iphone 使用addSubView时,ViewWillDisplay不会运行!

Iphone 使用addSubView时,ViewWillDisplay不会运行!,iphone,objective-c,cocoa-touch,Iphone,Objective C,Cocoa Touch,我卡住了!我不明白为什么viewWillAppear没有在我的代码中运行,但viewDidLoad运行。如果我理解正确,viewDidLoad会在第一个实例上运行一次,并且每次将视图添加到要显示的视图堆栈中时,ViewWillExample都会运行 我看到其他人也有这个问题,但有些人认为他们调用viewwill的解决方案会直接导致我的应用程序崩溃。其他解决方案与导航控制器和pushingView相关,但这也不是我正在使用的!我错过了什么 提前感谢您的帮助!:) 见下文: 视图控制器#1-当前显示

我卡住了!我不明白为什么viewWillAppear没有在我的代码中运行,但viewDidLoad运行。如果我理解正确,viewDidLoad会在第一个实例上运行一次,并且每次将视图添加到要显示的视图堆栈中时,ViewWillExample都会运行

我看到其他人也有这个问题,但有些人认为他们调用viewwill的解决方案会直接导致我的应用程序崩溃。其他解决方案与导航控制器和pushingView相关,但这也不是我正在使用的!我错过了什么

提前感谢您的帮助!:)

见下文: 视图控制器#1-当前显示在屏幕上

-(IBAction)someButtonPressed:(id)sender{
  NSLog(@"FirstViewController - someButtonPressed");
  SecondViewController *secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
  secondViewController.myLocation = self.myLocation;
  secondViewController.myDatabase = self.myDatabase;
  [self.view addSubview:secondViewController.view];
  //[secondViewController viewWillAppear:YES];
}
第二视图控制器:

- (void)viewWillAppear:(BOOL)animated {
  NSLog(@"SecondViewController - viewWillAppear");
  [super viewWillAppear:animated];
  // updating ivars with data
}


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {   
    NSLog(@"SecondViewController - viewDidLoad");
    [super viewDidLoad];
}

视图将出现:
在以正常方式之一显示视图控制器时调用(例如,通过在UIDABBARC控制器中选择选项卡,通过推到UINavigationController上,通过在UINavigationController中弹出到,通过显示
presentModalViewController:animated
,通过在
解除Modalviewcontrolleranimated:
后打开,等等)。仅显示带有
addSubview:
的视图不会调用该方法


可以正确地手动调用
视图将显示:
,但通常最好使用上面提到的一种正常方式。

视图将显示:当视图控制器以一种正常方式显示时,调用
(例如,通过在UIDABBARC控制器中选择选项卡,通过推到UINavigationController上,通过在UINavigationController中弹出到,通过显示
presentModalViewController:animated
,通过在
解除Modalviewcontrolleranimated:
后打开,等等)。仅显示带有
addSubview:
的视图不会调用该方法

可以正确地手动调用
视图将显示:
,但一般来说,最好使用上述正常方法之一

如果我理解正确,viewDidLoad会在第一个实例上运行一次,并且每次将视图添加到要显示的视图堆栈中时,ViewWillExample都会运行

每次加载UIViewController的视图时都会调用
-viewDidLoad
。在单个控制器的生命周期中,这可能会多次,因为视图可能会在不可见时卸载以释放内存,并重新加载,从而在需要时触发对
-viewDidLoad
的另一次调用

-视图将出现:
在UIViewController的视图可见时被调用。但是UIKit假设UIViewController的视图将填充其窗口。嵌套UIViewController的视图就是一个示例,并将导致意外行为。如您所见

请参阅《iOS视图控制器编程指南》中的:

您创建的每个自定义视图控制器对象负责管理单个视图层次结构中的所有视图。在iPhone应用程序中,视图层次结构中的视图传统上覆盖整个屏幕,但在iPad应用程序中,它们可能只覆盖屏幕的一部分。视图控制器和视图层次结构中的视图是关键的设计考虑因素。不应使用多个自定义视图控制器来管理同一视图层次结构的不同部分。同样,不应使用单个自定义视图控制器对象来管理多个屏幕内容

如果我理解正确,viewDidLoad会在第一个实例上运行一次,并且每次将视图添加到要显示的视图堆栈中时,ViewWillExample都会运行

每次加载UIViewController的视图时都会调用
-viewDidLoad
。在单个控制器的生命周期中,这可能会多次,因为视图可能会在不可见时卸载以释放内存,并重新加载,从而在需要时触发对
-viewDidLoad
的另一次调用

-视图将出现:
在UIViewController的视图可见时被调用。但是UIKit假设UIViewController的视图将填充其窗口。嵌套UIViewController的视图就是一个示例,并将导致意外行为。如您所见

请参阅《iOS视图控制器编程指南》中的:

您创建的每个自定义视图控制器对象负责管理单个视图层次结构中的所有视图。在iPhone应用程序中,视图层次结构中的视图传统上覆盖整个屏幕,但在iPad应用程序中,它们可能只覆盖屏幕的一部分。视图控制器和视图层次结构中的视图是关键的设计考虑因素。不应使用多个自定义视图控制器来管理同一视图层次结构的不同部分。同样,不应使用单个自定义视图控制器对象来管理多个屏幕内容


试试这个……我让它工作了:)


试试这个……我让它工作了:)


当您通过pushViewController:animatedpresentModelViewController:animated:推送视图或显示视图控制器时,它们将调用视图将显示:animated:,否则将为您调用方法。但是,如果手动添加SubView,则需要自行调用这些方法

当您通过pushViewController:animatedpresentModelViewController:animated:推送视图或显示视图控制器时,它们将调用视图将显示:animated:,否则将为您调用方法。但是,如果手动添加SubView,则需要自行调用这些方法

如果编写了自定义UIViewController容器,则可能会覆盖以下方法,从而导致所述行为

- (BOOL)shouldAutomaticallyForwardAppearanceMethods{
    return NO;
}
在这种情况下,您必须手动处理beginAppearanceTransition/endAppearanceTransition。
请参阅Apple文章

如果您编写了自定义UIViewController容器,则可能已覆盖以下方法:
- (BOOL)shouldAutomaticallyForwardAppearanceMethods{
    return NO;
}