Обнаружение отклонения родительского контроллера и контроллера модельного представления не работает - PullRequest
1 голос
/ 02 октября 2011

У меня есть UIViewController с именем ShowListViewController, который использует Modal View Controller для переноса другого представления в стек:

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

Затем я хотел бы вызвать мой метод populateTableData класса ShowListViewController, когда addShowViewController исчезнет.

Я думаю, что ответ , найденный здесь , будет работать, но это не так. Мой метод populateTableData не определяется как дополнительный метод для использования.

По сути, мои вопросы таковы: Как определить, когда исчезает контроллер модального представления, чтобы вызвать метод в классе, который поместил его в стек?

Ответы [ 3 ]

0 голосов
/ 02 октября 2011

Это может быть не лучшим решением, но может делать то, что вы хотите в данный момент.

В вашем showlistcontroller добавьте переменную экземпляра, например

BOOL pushedView;
@implementation ShowListViewController

и перед тем, как сделать модальное представление, установите его значения YES, например

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

в viewWillAppear ShowListViewController вы можете определить, появляется ли он, потому что всплывающее окно отклоняется или не похоже на

if (pushedView) {
    NSLog(@"Do things you would like to on pop dismissal");
    pushedView = NO;
}
0 голосов
/ 03 октября 2011

Я думаю, вы хотели бы что-то вроде этого.

Вы делаете делегата внутри вашего modalVC следующим образом:

@protocol ModalViewDelegate <NSObject>

- (void)didDismissModalView;

@end

и внедрите его в свой MainVC следующим образом:

@interface MainViewController : UIViewController <ModalViewDelegate>
{

Тогда вы сделаете свойство делегата в вашем modalVC следующим образом:

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

Вы устанавливаете dismissDelegate вашего ModalVC на свой MainVC, а затем создаете метод делегата. Прежде чем вы уволите его, однако, вы позвоните в ModalVC, чтобы сделать еще одну вещь. (который заполняет ваш стол). Вы будете запрашивать данные внутри вашего MainVC, а затем делать все, что захотите, как раз перед тем, как уволить ваш modalVC.

-(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];
}

Надеюсь, это поможет;)

0 голосов
/ 02 октября 2011

ОК, так что в шаблоне Apple для Utility App's они игнорируют то, что говорят документы для [UIViewController] [1], и фактически изо всех сил пытаются вызвать dismissModalViewControllerAnimated: из UIViewController, который выдвинул модальное представлениена экран.

Основная идея в вашем случае будет

  1. Определить протокол для AddShowViewControllerDelegate
  2. Заставить ShowListViewController реализовать этот протокол
  3. Вызовите метод делегата, чтобы попросить его уменьшить размер модального контроллера представления

Для полного примера просто создайте новый проект с шаблоном Utility и посмотрите на источник для FlipsideViewController иMainViewController

Вот пример, адаптированный для ваших нужд:

AddShowViewController.h

@class AddShowViewController;

@protocol AddShowViewControllerDelegate
- (void)addShowViewControllerDidFinish:(AddShowViewController *)controller;
@end

@interface AddShowViewController : UIViewController

@property (nonatomic, assign) id <AddShowViewControllerDelegate> delegate;

- (IBAction)done:(id)sender;

@end

AddShowViewController.m

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

ShowListViewController.h

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

ShowListViewController.m

- (void)addShowViewControllerDidFinish:(AddShowViewController *)controller
{
    [self dismissModalViewControllerAnimated:YES];
    [self populateTableData];
}
...