viewDidAppear 只在某些情况下被调用?

Posted

技术标签:

【中文标题】viewDidAppear 只在某些情况下被调用?【英文标题】:viewDidAppear only gets called under certain circumstances? 【发布时间】:2015-02-26 20:33:29 【问题描述】:

我有这个突然出现的问题,我检查了我在过去一周所做的所有更改,但似乎没有什么可以解释为什么我的 viewDidAppear 仅在某些情况下推送到我的 VC 时才会被调用。这是我推给我的 VC 的两种方式。

-(void)receiveOnHostRoomConnectNotification:(NSNotification *)notificaiton

    [[NSNotificationCenter defaultCenter]removeObserver:self name:kInitialize     object:nil];
    [[NSNotificationCenter defaultCenter]removeObserver:self name:kOnHostRoomConnect object:nil];
    [[NSNotificationCenter defaultCenter]removeObserver:self name:kOnConnect object:nil];

    dispatch_async(dispatch_get_main_queue(), ^
            [self performSegueWithIdentifier:@"toSetListRoomVC" sender:self];
    );

收到此“onHost”通知后,我执行 segue。像这样向 VC 推送每次都有效。 viewDidAppear 每次都会在 SetListRoomVC 中被调用。

但是,在推送此通知时。 destinationVC 的 viewDidAppear 永远不会被解雇。我暂时没有对这些方法进行任何更改,我怀疑它与它们有关,但只是解释正在发生的事情。

-(void)receiveInitializeNotification:(NSNotification *)notificaiton

    [[NSNotificationCenter defaultCenter]removeObserver:self name:kInitialize     object:nil];
    [[NSNotificationCenter defaultCenter]removeObserver:self name:kOnHostRoomConnect object:nil];
    [[NSNotificationCenter defaultCenter]removeObserver:self name:kOnConnect object:nil];
    if (self.joinLabelSelected) 
        self.roomCodeTextField.inputAccessoryView.hidden = YES;
        [self.roomCodeTextField resignFirstResponder];
        self.menuView.hidden = YES;
        [self returnJoinLabel];
        [UIView animateWithDuration:.25 animations:^
            self.roomCodeView.alpha = 0;
            self.blurEffectView.alpha = 0;
         completion:^(BOOL finished) 
            dispatch_async(dispatch_get_main_queue(), ^
                [self performSegueWithIdentifier:@"toSetListRoomVC" sender:self];
            );

        ];
    

我还使用了自定义 segue 和嵌入式导航控制器。这就是我设置自定义segue的方式。

@implementation CustomSegue
-(void) perform
    [[[self sourceViewController] navigationController] pushViewController:[self   destinationViewController] animated:NO];

@end

我所有的 viewDidLoad,viewWillAppear,viewDidAppear 都实现了 [super view...:animated];

再一次,我有一段时间没有对我的任何加载、显示、方法进行任何重大更改。我真的不明白为什么现在会发生这种情况。

谁能解释一下?此外,每隔一段时间,可能有 10% 的时间,viewDidAppear 方法会在推送“onHost”通知时被触发。

感谢您的帮助。这让我难以置信。

编辑:我回滚到几天前的提交并开始重建我的项目。到目前为止 viewDidAppear 正在工作。我将尝试查明到底是什么搞砸了一切。很奇怪,因为我必须重建的大部分只是 Helper 方法和次要的 UI 更新。

【问题讨论】:

我应该假设前两个方法在同一个类中实现吗?如果你在那个类中有/创建了一个prepareForSegue: 方法,它会被调用吗? 是的,它们在同一个类中,我使用的是 prepareForSegue: 方法。它正在被调用。推送到新的 VC 对每个通知都有效,我只是用它来解释 viewDidAppear 如何只在一种情况下工作。但是,viewDidAppear 仅在从“onInitialze”通知@PhillipMills 推送后才有效 【参考方案1】:

这些方法应该每次都被调用,我从来没有见过它们没有被调用。

也许您正在使用从 UIViewController 继承的多个子类而忘记调用 super?在这种情况下,确实没有调用超级实现:

- (void)viewWillAppear:(BOOL)animated 
    [super viewWillAppear:animated];
    // do your stuff

- (void)viewDidAppear:(BOOL)animated 
    [super viewDidAppear:animated];
    // do your stuff

- (void)viewWillDisappear:(BOOL)animated 
    // do your stuff
    [super viewWillDisappear:animated];

- (void)viewDidDisappear:(BOOL)animated 
    // do your stuff
    [super viewDidDisappear:animated];

在少数情况下,可能会调用交互式UINavigationController 转换,其中可能会调用-viewWillDisappear:,但不会调用-viewDidDisappear:。例如。如果用户从屏幕左侧擦除以向后导航,然后取消此操作。这可能导致-viewWillDisappear:,但没有对应的-viewDidDisappear:

【讨论】:

感谢您的回复,但我认为情况并非如此。我没有使用交互式过渡。没有任何东西从 UIViewController 继承。 真的吗?你确定你没有 UIViewController 子类吗?这将是一个非常奇怪的应用程序;除了“viewWillAppear”是在 UIViewController 中定义的。所以你的问题没有多大意义...... 哦,我当然知道,对不起。是的,我所有的 UIViewController 子类都实现了 [super view...];【参考方案2】:

您的导航控制器是否曾经落后于任何东西?例如,我认为如果您使用 presentViewController: 在导航控制器顶部显示模式视图控制器,然后将 VC 推送到导航控制器上,则不会调用 viewDidAppear,因为 ios 会认为它在屏幕外。

您是否尝试过将 NSLogs 放入导航控制器的 viewWillAppear 和 viewWillDisappear 方法,以确保导航控制器在您推送新视图控制器时认为它是可见的?

【讨论】:

以上是关于viewDidAppear 只在某些情况下被调用?的主要内容,如果未能解决你的问题,请参考以下文章

如何只在 viewDidAppear 中做一些事情?

ContextMenu 在某些情况下被剪裁

将 .csv 导入 MySQL 数据库时,某些数据在没有明显原因的情况下被修改,知道吗?

在不调用每个 viewDidAppear 的情况下解雇 rootViewController

您可以强制 SQL 存储过程按给定顺序获取锁吗

setEvent 在没有 ResetEvent 的情况下被调用