【问题标题】:viewWillAppear not getting calledviewWillAppear 没有被调用
【发布时间】:2016-03-24 20:44:49
【问题描述】:

我有一个嵌入在导航控制器 (NAV1) 中的视图控制器 (VC1)。在其 viewWillAppear 方法中,我调用以模态方式呈现另一个视图控制器。在一种情况下,我需要用动画呈现新的视图控制器(VC2),而在另一种情况下,它应该在没有动画的情况下呈现。 VC2 也嵌入在它自己的导航控制器(NAV2)中。

当动画标志设置为 TRUE 时一切正常。当我将标志设置为 FALSE 时,出现了一些问题: 1. 我在控制台中收到以下警告:不鼓励在分离的视图控制器上呈现视图控制器 2. 当我在调用dismissViewControllerAnimated:FALSE completion:nil 后从VC2 移回时,VC1 的viewWillAppear 方法不会被调用。如果动画标志设置为 TRUE,它就会被调用。

在 VC1 中:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [self performSelector:@selector(importStuff:)
                           withObject:nil];

}

-(void)importStuff
{
//instatntiate VC2
//instantiate NAV2

[Utility presentViewController:pNavController
            fromViewController:self
                      animated:FALSE
                    completion:nil];

// the above method calls the presentViewController:animated:completion: method
} 

在 VC2 中:

[Utility dismissViewController:self
                      animated:FALSE
                    completion:nil];

上述方法调用dismissViewControllerAnimated:方法。

【问题讨论】:

  • 听起来你在错误的地方展示了新的视图控制器? viewDidAppear 怎么样?
  • 您已经呈现的视图未完全呈现,您正在尝试呈现另一个控制器,如果没有动画,所花费的时间要少得多,因此在呈现您的父母之前完成
  • 在 viewDidLoad 中添加此代码后尝试。
  • 在 viewDidAppear 中添加代码确实解决了问题。在 viewDidLoad 中添加它不是我的解决方案。

标签: ios objective-c


【解决方案1】:

不是解决方案,而是解决方法:

您可以使用afterDelay:0 轻松地将任何 UI 操作推迟到下一个事件循环:

[self performSelector:@selector(importStuff:)
           withObject:nil
           afterDelay:0];

这将使当前操作有机会完成。
此外,0.4 的延迟将与操作系统匹配。但是,无论您使用什么延迟(0 除外) 都是一个杂项,并且不能保证在任何情况、设备和内存负载等情况下都能正常工作。

相反,您应该重新审视您的方法。


改变你的设计:

首先不要冒险遇到这个动画比赛。 您有几个选择,包括:

  • 自行控制过渡动画并等待其完成,然后再推送另一个视图控制器(使用完成信号或完成块)
  • 完全改变您的方法以完全避免这个难题

【讨论】:

    【解决方案2】:
    -(void)viewWillAppear:(BOOL)animated{
    
        [super viewWillAppear:animated];
        [self performSelector:@selector(importStuff) withObject:nil afterDelay:0.1];
    
       }
    
    -(void)importStuff
    {
        //instatntiate VC2
        //instantiate NAV2
    
        SecondViewController *viewMe=[self.storyboard instantiateViewControllerWithIdentifier:@"second"];
        [self.view.window.rootViewController presentViewController:viewMe animated:NO completion:nil];
    
        // the above method calls the presentViewController:animated:completion: method
    }
    

    【讨论】:

    • 0.1从何而来? 0 已经推迟到下一个事件,并且 OS 动画持续时间超过 0.1 秒。只是好奇。
    • Ya 0 或 0.1 没有太大区别。但我认为给予最小的延迟是有效的。
    猜你喜欢
    • 1970-01-01
    • 2011-05-19
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多