确定是不是正在显示模态视图控制器

Posted

技术标签:

【中文标题】确定是不是正在显示模态视图控制器【英文标题】:Determine if a modal view controller is being shown确定是否正在显示模态视图控制器 【发布时间】:2013-01-13 01:22:54 【问题描述】:

是否可以确定当前是否正在显示模态视图控制器?目前正在观看?

我有一个问题,viewDidAppear 被调用了两次,并且只需要调用一次,为了解决,我想看看如果模态视图控制器在运行一段代码时是否在屏幕上,否则什么都没有。

如果我可以在导航堆栈上的当前视图控制器内进行编码,并查看当前是否有模态视图控制器在其之上,那将会很有用?

【问题讨论】:

你不能用 bool 属性跟踪显示/隐藏模态视图控制器的时间吗? 【参考方案1】:

检查模态视图控制器是否良好的正确位置是它正在呈现的视图控制器。呈现的 viewController 应该知道它呈现的 viewController 是否仍然存在,或者已经被解除(它负责这两个任务)。 presentingViewController 有一个属性,presentedViewController,它带有你需要的引用。

如果模态 VC 已被掩盖,例如通过其自身推送另一个 viewController,您将能够从它的 navController.viewControllers 数组属性中确定:再次,最佳参考源返回到呈现的 viewController。

如果你不能从它呈现的 viewController 中获得对模态 viewController 的引用,那么你的设计可能有问题,你需要重新考虑。

【讨论】:

【参考方案2】:

如果“viewDidAppear”被调用了两次,则可能是您两次实例化(创建)您的视图。

在“viewDidAppear”中设置断点并查看回溯以查看您的新视图控制器是通过编程方式(在代码中)创建还是在您的 XIB 或 Storyboard 中实例化。

只需要创建一次,如果只创建一次,“viewDidAppear”只会被调用一次。

【讨论】:

附注您是在谈论 modal 视图还是常规视图?在 Valentin 进行编辑之前,您在谈论“模型视图控制器”(这是一种设计模式),我怀疑您只是在谈论常规视图。但随后@sooper 提到了“模态”,我认为这就是启发 Valentin 进行编辑的原因。 我认为他是在谈论第一次启动 VC,获取viewDidAppear,将第二个控制器呈现为模态,关闭该模态,然后在第一个控制器上再次获取 viewDidAppear它的视图再次出现。这是标准操作程序。 @MichaelDautermann 谢谢两位,我在开始时加载了一个 VC,如果没有提供用于登录的模型 VC,它会检查用户是否已登录。我看到的是原始(第一个)VC 上的 viewDidAppear 被调用了两次。你是对的,理想情况下我不希望这被调用两次,我不确定这是否正常。如果这是我可以用断点回溯的东西,我如何从代码中的停止处确定回调发生的位置?【参考方案3】:

如果您希望 viewDidAppear 中的某些内容执行一次,有很多方法可以做到,但这里有一个。首先,定义类属性:

@property (nonatomic) BOOL alreadyRun;

然后在viewDidAppear 中检查该属性:

- (void)viewDidAppear:(BOOL)animated

    [super viewDidAppear:animated];

    if (!self.alreadyRun)
    
        self.alreadyRun = YES;

        // do whatever you need to have done once per instance of this VC
    

【讨论】:

【参考方案4】:

我认为您可以使用 PresendedViewController 属性。早期版本是modalViewController。

【讨论】:

以上是关于确定是不是正在显示模态视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

模态视图控制器大小

通过模态视图呈现详细视图控制器 [关闭]

部分卷曲过渡导致控件调整大小

在 TabBarController 中显示模态视图控制器

以模态方式呈现视图控制器时,导航栏与黑色而不是白色混合

带有 AngularJs 的 Ionic 框架:模态是不是可以与启动模态的视图具有相同的控制器?