父视图控制器和模型视图控制器解除检测不起作用

时间:2011-10-02 09:21:06

标签: iphone objective-c cocoa-touch uiviewcontroller modalviewcontroller

我有一个名为ShowListViewController的UIViewController,它使用模态视图控制器将另一个视图压入堆栈:

AddShowViewController *addShowViewController = [[AddShowViewController alloc] init];
[addShowViewController setModalTransitionStyle:UIModalTransitionStyleCoverVertical];
[self presentModalViewController:addShowViewController animated:YES]; 

ShowListViewController消失时,我想调用addShowViewController类的方法populateTableData。

我认为answer found here会起作用,但事实并非如此。我的方法populateTableData未被检测为可选方法。

基本上我的问题是:如何检测模态视图控制器何时消失,以便在类中调用将其推入堆栈的方法?

3 个答案:

答案 0 :(得分:0)

好的,似乎在Apple的Utility App's模板中,他们忽略了[UIViewController] [1]的文档,并且实际上不再从{{1}调用dismissModalViewControllerAnimated:将模态视图推到屏幕上。

您案例中的基本想法是

  1. UIViewController
  2. 定义协议
  3. AddShowViewControllerDelegate实施此协议
  4. 调用委托上的方法,要求它模仿模态视图控制器
  5. 要获得完整示例,只需使用ShowListViewController模板创建一个新项目,然后查看UtilityFlipsideViewController

    的来源

    以下是适合您需求的示例:

    <强> AddShowViewController.h

    MainViewController

    <强> AddShowViewController.m

    @class AddShowViewController;
    
    @protocol AddShowViewControllerDelegate
    - (void)addShowViewControllerDidFinish:(AddShowViewController *)controller;
    @end
    
    @interface AddShowViewController : UIViewController
    
    @property (nonatomic, assign) id <AddShowViewControllerDelegate> delegate;
    
    - (IBAction)done:(id)sender;
    
    @end
    

    <强> ShowListViewController.h

    - (IBAction)done:(id)sender
    {
        [self.delegate addShowViewControllerDidFinish:self];
    }
    

    <强> ShowListViewController.m

    @interface ShowListViewController : UIViewController <AddShowViewControllerDelegate>
    {   
        ...
    }
    

答案 1 :(得分:0)

这可能不是最佳解决方案,但可以在此时做你想做的事。

在你的showlistcontroller中添加一个像

这样的实例变量
BOOL pushedView;
@implementation ShowListViewController

在进行模态演示之前,将其值设置为YES,如

pushedView = YES;
[self.navigationController presentModalViewController:popView animated:YES];

在ShowListViewController的viewWillAppear中,你可以检测它是否出现,因为pop被解雇了或不喜欢

if (pushedView) {
    NSLog(@"Do things you would like to on pop dismissal");
    pushedView = NO;
}

答案 2 :(得分:0)

我想你想要这样的东西。

你在你的modalVC里面建了一个代表:

@protocol ModalViewDelegate <NSObject>

- (void)didDismissModalView;

@end

并在你的MainVC中实现它:

@interface MainViewController : UIViewController <ModalViewDelegate>
{

然后你将在modalVC中创建一个委托属性,如下所示:

    @interface ModalShizzle : UIViewController
    {
        id<ModalViewDelegate> dismissDelegate;
    }

您将ModalVC的dismissDelegate设置为MainVC,然后创建委托方法。在你解雇它之前,你会打电话给ModalVC做最后一件事。 (这是填充你的表)。在您解雇modalVC之前,您将调用MainVC中的数据,然后执行您的任何操作。

-(void)didDismissModalView
{
    //call ModalVC data here...
    //then do something with that data. set it to a property inside this MainVC or call a method with it.
    //method/data from modalVC is called here and now u can safely dismiss modalVC
    [self dismissModalViewControllerAnimated:YES];
}

希望它有所帮助;)