iOS中的ViewDidLoad和UINavigationController?

时间:2012-06-20 18:01:49

标签: objective-c ios xcode model-view-controller

我有一个基于UINavigationController的应用。有一个带有按钮的菜单屏幕,可以按下(推入导航控制器堆栈)9个其他“子屏幕”之一。这些子屏幕都不会转到任何其他屏幕。当用户完成在“子屏幕”上输入数据时,他们可以按下完成按钮,该按钮将弹回到原始菜单屏幕。 (如果你难以想象这个,想象一下像故事板一样的树,其中有一个根ViewController,然后是9个叶子viewControllers)。

好的,所以使用该设置我有一些关于viewDidLoad如何工作的问题。

〜首先,每次我们转换到子屏幕时都应该调用viewDidLoad。例如,假设我从菜单屏幕转到子屏幕“B”,回到菜单屏幕,然后回到子屏幕“B”。 B的viewDidLoad方法应该被调用两次吗?如果没有,为什么我的两次被召唤?

〜第二,假设每次都会调用它,如果我需要为每个子屏幕执行一次很长的操作,我该怎么办?我应该把它们放在哪里(如果我把它们放在viewDidLoad中,如果用户在这个页面和菜单之间来回切换,它会多次发生?)

3 个答案:

答案 0 :(得分:1)

回答你的问题:

  1. 是的,通常B的viewDidLoad方法应该在每次被推送到UINavigationController的堆栈时被调用。这是因为每次从堆栈弹出B时,它通常会被释放,每次你去B时都会创建一个新的B实例。

  2. 处理此类情况的方法可能很多。如果没有确切地知道你想要做什么,很难说出什么是适合你的。一种方法是创建一个处理处理的singleton object。这可能比在UIViewController中处理它更好的原因是单例可以在应用程序的整个生命周期中存在,而UIViewControllers通常具有相对较短的寿命。 Singleton对象只需创建一次,它们可以管理在应用程序生命周期内需要保留的任何操作和数据。

答案 1 :(得分:0)

每次出现视图时都会调用

viewWillAppearviewDidLoad仅在构造视图时调用 - 例如,在访问视图时视图控制器initFromNibNamed调用之后。只要您的视图控制器不在视图中但进入视图,就会调用viewWillAppear - 因此,当您按下视图控制器时,将调用viewWillAppear。所以你可能会认为你的viewDidLoad被调用了两次,但实际上它可能不是。所以你应该把方法放在viewDidLoad中。你在做什么需要很长时间?

答案 2 :(得分:0)

1。  加载视图时调用viewDidLoad,并在视图可见时调用viewWillAppear。

如果多次调用viewDidLoad,则表示每次显示视图时都会加载视图,并在每次弹出视图时释放它。如果您发布一些代码,我可以帮助您更好地识别问题。

你能做的是这样的事情:

在你的“root”viewController类中,将每个“leaf”ViewController声明为一个成员,假设它们被称为leafController1,leafController2等,并为它们创建retain-properties。

@interface YourRootViewController : UIViewController {
    LeafController1Class *leafController1;
    LeafController2Class *leafController2;
    // ...
}

@property (nonatomic, retain) LeafController1Class *leafController1;
@property (nonatomic, retain) LeafController2Class *leafController2;

// ...

@end

在您的顶级ViewController的ViewDidLoad中,使用“initWithNibName”等(或者您正在创建它们的任何操作)初始化所有叶子控制器。像这样保留他们的实例:

self.leafController1 = [[[LeafController1Class alloc] initWithNibName:@"LeafController1NibName" bundle:nil] autorelease];

当用户按下按钮时,将正确的叶子推送到navigationcontroller:

[myNavigationController pushViewController:leafController1 animated:YES];

现在弹出叶子控制器时,它们将保留在内存中,因为您保留了它们。 这样,只要您始终将viewcontroller的同一个实例推送到您的navigationcontroller,您的viewDidLoad将只为每个叶子调用一次。

2。 与视图相关的重代码应在加载视图时执行,即由viewDidLoad触发。但是,保留其他包含应用程序信息的类可能是一个好主意,这些类不是视图控制器,而是与UI分离。在后台更好地进行繁重的计算,或者第一次加载应用程序时。

相关问题