手动实例化ViewController并推送到顶部。好的做法?

时间:2013-04-11 16:35:52

标签: ios model-view-controller uiviewcontroller

我正在做的是:

UIViewController *rootController = [[[UIApplication sharedApplication] keyWindow] rootViewController];
AlarmRingViewController *alarmController = [[AlarmRingViewController alloc] init];
[rootController presentViewController:alarmController animated:YES];

我想要实现的目的是将我的AlarmRingViewController推到目前正在显示的任何其他控制器的顶部,并且它到目前为止是有效的。

现在我想知道这是不是很好的做法:

  • 每次出现时都要实现一个新的viewController
  • 在非UI相关课程中这样做? (在我的例子中是NSTimer的调度程序)
  • 从那里推送新创建的viewController,其中rootViewController位于顶部

或者这是否违反了MVC模式或苹果指南或其他任何内容。 欢呼声

2 个答案:

答案 0 :(得分:1)

我个人认为这是丑陋的代码。它难以阅读且难以调试。将代码拆分一点:

UIViewController *rootController = [[[UIApplication sharedApplication] keyWindow] rootViewController];
AlarmRingViewController *alarmController = [[AlarmRingViewController alloc] init];
[rootController presentViewController:alarmController animated:YES];

在一行中输入这么多内容没有任何好处。

更新:根据您更新的问题:

每次需要时,实例化新的视图控制器都没有问题。这很常见。创建一个并缓存它可能是合适的。如果在任何给定时间只显示其中一个视图控制器,视频控制器经常使用,并且创建需要花费大量时间,那么这是一个有意义的优化。

视图控制器通常由其他(视图)控制器创建和显示。

答案 1 :(得分:0)

为什么不直接使用UINavigationController作为根视图控制器。这样,您可以这样做:

AlarmRingViewController *alarmController = [[AlarmRingViewController alloc] init];
[self.navigationController presentViewController:alarmController animated:YES completion:nil];