使用addSubView时viewWillAppear不运行!

时间:2011-03-29 01:29:07

标签: iphone objective-c cocoa-touch

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

我看到其他人遇到过这个问题,但有些人调查viewWillAppear的解决方案是如何导致我的应用程序崩溃的。其他解决方案与Navigation Controller和pushView相关,但那不是我正在使用的!我错过了什么?

提前感谢您的帮助! :)

见下文: View Controller#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];
}

SecondViewController:

- (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];
}

5 个答案:

答案 0 :(得分:9)

  

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

每次加载UIViewController视图时都会调用

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

当UIViewController的视图变得可见时,将调用

-viewWillAppear:。但是UIKit假设UIViewController的视图将填满他们的窗口。嵌套UIViewControllers的视图是abusing UIViewControllers的一个示例,将导致意外行为。如你所见。

请参阅“适用于iOS的View Controller编程指南”中的About Custom View Controllers

  

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

答案 1 :(得分:4)

如果你编写了一个自定义的UIViewController容器,你可能已经覆盖了以下方法,这会导致你描述的行为。

- (BOOL)shouldAutomaticallyForwardAppearanceMethods{
    return NO;
}

在这种情况下,您必须手动处理beginAppearanceTransition / endAppearanceTransition。 请参阅Apples View Controller Containment文章

答案 2 :(得分:2)

以正常方式之一显示视图控制器时会调用

viewWillAppear:(例如,通过选择UITabBarController中的选项卡,通过按下UINavigationController,通过弹回到在UINavigationController中,通过显示presentModalViewController:animated,在dismissModalViewControllerAnimated:之后被发现,等等。只显示addSubview:的视图不会调用该方法。

可以手动正确调用viewWillAppear:,但一般情况下最好使用上述常规方法之一。

答案 3 :(得分:0)

试试这个..我得到了它的工作:)

- (void)viewWillAppear:(BOOL)animated {
  [super viewWillAppear:animated]; 
  NSLog(@"SecondViewController - viewWillAppear");

  // updating ivars with data
}

答案 4 :(得分:0)

当您通过 pushViewController:动画 presentModelViewController:动画:推送视图或呈现视图控制器时,它们将调用 viewWillAppear:animated: ,以及其他方法。但是如果你手动添加子视图,你需要自己调用这些方法。