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

时间:2015-02-26 20:33:30

标签: ios objective-c uiviewcontroller

我有这个突然出现的问题,我检查了过去一周所做的所有更改,似乎没有解释为什么我的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实现[超级视图...:动画];

再一次,我暂时没有对我的任何负载,出现,方法做出任何重大改变。我真的不明白为什么现在这样。

有人能解释一下吗?此外,每隔一段时间,也许有10%的时间,viewDidAppear方法将在推送' onHost'通知。

感谢您的帮助。这令人难以置信。

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

2 个答案:

答案 0 :(得分:0)

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

也许您正在使用从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:

答案 1 :(得分:0)

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

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