【问题标题】:How UINavigationController and UIViewController works?UINavigationController 和 UIViewController 是如何工作的?
【发布时间】:2012-03-11 15:38:13
【问题描述】:

我正在了解UINavigationControllerUIViewControllers。这是我构建的简单应用程序。请注意,我使用的是 ARC。

我的应用有一个导航控制器和两个视图控制器(我们称它们为FirstViewControllerSecondViewController)。当应用程序启动时,导航控制器将FirstViewController 推送到堆栈上。

FirstViewController 中,我有一个按钮,当被触摸时会按下 SecondViewController。这是一些代码。

FirstViewController.m

-(IBAction)pushSecondViewController
{
    SecondViewController *secondViewController = [SecondViewController alloc]init];
    [self.navigationController pushViewController:secondViewController animated:YES];
}

在第二个视图控制器中,我有一个按钮,可以从堆栈中弹出当前视图控制器。

SecondViewController.m

-(IBAction)popViewController
{
    [self.navigationController popViewControllerAnimated:YES];
}

到目前为止,一切都很好。以下是我的问题:

navigationController 是否检查SecondNavigationController 的现有实例,如果不存在则创建一个新实例?

如果不是,我是否应该使用单例来确保只创建和重用一个实例,而不是每次按下SeconViewController 的按钮被触摸时都创建一个新实例?

【问题讨论】:

    标签: objective-c ios uiviewcontroller uinavigationcontroller


    【解决方案1】:

    使用您当前的代码,第二个视图控制器在从堆栈中弹出时将被销毁,所以不,导航控制器不会重用它。

    如果您真的想保留第二个视图控制器,请将其作为第一个视图控制器的强大属性,但除非您确实有理由这样做,否则不要这样做 - 您使用的方法是标准的并创建一个新的视图控制器通常更喜欢使用甚至不在屏幕上的视图控制器占用大量内存。内存比处理器资源更稀缺,创建视图控制器一直在发生。

    【讨论】:

    • 不,我不想保留第二个视图控制器。我很好奇导航控制器的工作原理。谢谢你的解释!
    • 为了不开始新话题。如果我的应用程序包含四个视图控制器,那么第一个和第二个视图控制器在应用程序中只使用一次。我应该从导航控制器中弹出它们([self.navigationController popViewControllerAnimated:YES])以不使用内存吗?
    • 不行,只能使用 push 和 pop 来上下导航栈。
    【解决方案2】:

    我同意 jrturton 并添加以下准则。

    首先,在我看来,将控制器设为单例并不是一个好主意。

    然后,您必须自己检查UINavigationController“控制器数组”中是否存在某种类型的实例。

    @property(nonatomic, copy) NSArray *viewControllers
    

    最后,您可以为您的控制器创建一个强引用,但这根本没有必要。新控制器的创建非常快。如果有的话,我会缓存上面显示的数据,而不是对其进行强引用。这样可以避免用户等待已经下载的数据。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2011-02-20
      • 2012-02-07
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多