在解除模态视图控制器后调用viewWillAppear函数

26

如何在解除了modalviewcontroller后调用viewwillappear

请提供任何想法,因为在解除我的modalviewcontroller后,viewwillappear没有被调用:

以模态方式呈现我的视图控制器: //第一个视图控制器:

-(IBAction)AddActivity:(id)sender{


    CreateActivity *addViewController = [[CreateActivity alloc] initWithNibName:@"CreateActivity" bundle:nil];

    addViewController.delegate = self;
    addViewController.modalPresentationStyle = UIModalPresentationFormSheet;

    addViewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;

    [self presentModalViewController:addViewController animated:YES];


    addViewController.view.superview.frame = CGRectMake(50, 260, 680, 624);

}

//secondvioewcontroller:我创建了一个alertview来关闭这个modalview,但是viewwillapear没有被调用:


//secondvioewcontroller: 我使用了一个alertView来dismiss这个modalView,但是viewWillAppear方法没有被调用。
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    if (buttonIndex == 0){


        if ([self respondsToSelector:@selector(presentingViewController)]){
            [self.presentingViewController dismissModalViewControllerAnimated:YES];
        }
        else {
            [self.parentViewController dismissModalViewControllerAnimated:YES];
        }
    }
}

3
你确定吗?你是如何进行确认的?根据我的经验,当已显示的模态视图被解除显示时,viewWillAppear始终会为呈现的视图控制器触发。 - geraldWilliam
我想关闭我的模态视图,并调用我的第一个视图控制器的viewWillAppear方法来进行一些操作。 - Ouassim Mouyarden
抱歉,我错过了,但是viewWillAppear也被调用了。你是在说呈现视图控制器中的viewWillAppear吗? - rdelmar
我的第一个视图控制器的viewWillAppear。 - Ouassim Mouyarden
这是为iPad还是iPhone?你为什么要这样做:addViewController.view.superview.frame = CGRectMake(50, 260, 680, 624)?一个视图控制器的视图没有超级视图,所以那一行不会有任何作用。 - rdelmar
显示剩余8条评论
2个回答

13

presentModalViewController:animated: / dismissModalViewControllerAnimated:已被弃用,应使用presentViewController:animated:completion: / dismissViewControllerAnimated:completion:代替。

您可以使用完成块来执行任何消除后的代码:

- (void) alertView: (UIAlertView *) alertView clickedButtonAtIndex: (NSInteger) buttonIndex
{
    if (buttonIndex == 0)
    {
        MyCustomViewController* mcvc = (MyCustomViewController*)self.presentingViewController;

        [self dismissViewControllerAnimated: YES completion: ^{

             // call your completion method:
             [mcvc someCustomDoneMethod];
        }];
    }
}
更好的是,如果您正在使用故事板,则可以实现一个取消退回segue并在取消回调方法中触发完成代码。

谢谢您的回复,那么[self.presentingViewController someCustomDoneMethod];中的someCustomDoneMethod必须在我的FirstViewController中定义,它将在模态视图消失后被调用吗? - Ouassim Mouyarden
你可能需要将presentingViewController强制转换为您的自定义控制器类型,以便您可以调用该方法。请注意我对示例进行了一项编辑。您不必在呈现视图控制器上调用dismissViewControllerAnimated。您只需针对self调用即可。 - TomSwift

12
由于您将模态视图控制器作为表单表格呈现,因此呈现控制器的视图在解散后永远不会消失,所以viewWillAppear:在解散后不会被调用。如果您希望呈现的视图控制器在解散后处理某些内容,请在模态控制器的viewDidDisappear:方法中调用代理方法。您已经设置了代理,因此我假定您已经在CreateActivity中拥有一个代理协议。
顺便提一下,您应该使用非弃用的方法来呈现和解散模态视图控制器。

不必调用委托方法,您可以在completion:中执行代码以dismissViewController:animated:completion:。如果将代码放置在viewDidDisappear中,则可能会出现问题,如果控制器是导航堆栈的一部分(例如,您推送另一个控制器..)。如果仍要使用viewDidDisappear,请确保检查self.isBeingDismissed。 - TomSwift

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接