0

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

好的,所以有了这个设置,我有几个关于如何viewDidLoad工作的问题。

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

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

4

3 回答 3

1

要回答您的问题:

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

  2. 可能有很多方法可以处理这种情况。如果不确切地看到您正在尝试做什么,就很难说出什么适合您。一种方法是创建一个处理处理的单例对象。这可能比在 UIViewController 中处理它更好的原因是单例可以在应用程序的整个生命周期中存在,而 UIViewControllers 通常具有相对较短的生命周期。单例对象可以只创建一次,它们可以管理您需要在应用程序的生命周期中持久保存的任何操作和数据。

于 2012-06-20T18:08:27.433 回答
0

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

于 2012-06-20T18:19:12.490 回答
0

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

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

你可以做的是这样的:

在您的“根”viewController 类中,将每个“叶”ViewController 声明为成员,假设它们被称为leafController1、leafController2 等,并为它们创建保留属性。

@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];

当用户按下按钮时,将正确的叶子推送到导航控制器:

[myNavigationController pushViewController:leafController1 animated:YES];

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

2. 与视图相关的繁重代码应在视图加载完毕后执行,即由viewDidLoad触发。但是,保留其他保存有关您的应用程序信息的类可能是一个好主意,这些类不是视图控制器并且与 UI 分开。繁重的计算最好在后台进行,或者在第一次加载应用程序时进行。

于 2012-06-20T18:42:27.220 回答