如何当前呈现视图控制器的实例?
Posted
技术标签:
【中文标题】如何当前呈现视图控制器的实例?【英文标题】:How to current instance of presented view Controller? 【发布时间】:2016-07-26 13:44:17 【问题描述】:我正在使用下面的代码来展示视图控制器,
ViewController *ViewController = [[ViewController alloc] init];
ViewController.modalPresentationStyle = UIModalPresentationFormSheet;
UINavigationController *navLayersViewController = [UINavigationController alloc] initWithRootViewController:ViewController];
[self presentViewController:navLayersViewController
animated:YES
completion:^
];
我想在其他类中获取这个预先设置的“viewController”的当前实例。我怎样才能得到它。提前致谢!
【问题讨论】:
【参考方案1】:你需要先展示导航控制器。
ViewController *myViewController = [[ViewController alloc] init];
myViewController.modalPresentationStyle = UIModalPresentationFormSheet;
UINavigationController *navLayersViewController = [UINavigationController alloc] initWithRootViewController:myViewController];
如果你在视图控制器类中展示它,那么做
[self presentViewController: navLayersViewController animated:YES completion:nil];
否则获取根控制器的引用,然后做
[rootController presentViewController: navLayersViewController animated:YES completion:nil];
【讨论】:
【参考方案2】:如果您需要两个视图控制器相互了解,那么您就有了架构问题。
通常,您的 VC 只处理视觉效果/UI 交互,例如动画或按钮触摸。这些东西显然不需要超出 VC(VC2 不在乎 VC1 有淡入淡出动画,或者 3 个按钮)。
在显示数据时,数据来自外部类/服务/管理器;人们称之为许多不同的东西。
但好消息是,如果该“服务”在您的控制器之外,您可以在任何地方使用它。
在 VC1 中,您可以执行 myService.GetListOfMessages();
(例如),没有什么能阻止您从另一个班级使用相同的服务执行此操作。您现在可以从 VC1、VC2 或任何必要的地方访问您的消息列表。
请记住,通常情况下,您的 VC 不应该做任何与视觉效果无关的事情。如果你在做 web 服务调用、业务逻辑或类似的事情,它属于另一个类。这样,它是有组织的(这本身就足够了),而且,如果你的视觉效果发生变化,或者你在其他地方需要相同的逻辑,你就已经准备好了课程。
这不是一个完整的例子,但如果你对编程足够熟悉,你应该可以很好地实现它。
小心点:
不要过度使用单例,或者更糟糕的是静态。 不要忘记单一职责(不要把所有东西都放在一个类中)。 不要进行不必要的 Web 服务调用。如果是您经常使用的数据,请将其保存在内存中。考虑到所有这些,您应该没问题,您的控制器实际上会处理更少的工作,同时仍然可以访问他们需要的数据。
【讨论】:
以上是关于如何当前呈现视图控制器的实例?的主要内容,如果未能解决你的问题,请参考以下文章
如果当前视图控制器被呈现并推送,如何展开到正确的视图控制器?