Как я могу обнаружить отклонение модального контроллера представления в родительском контроллере представления? [Дубликат]

Possible Duplicate:
Call Function in Underlying ViewController as Modal View Controller is Dismissed

Я перепробовал почти все. Вот что я пробовал:

<code>-(void)viewWillAppear:(BOOL)animated
{

NSLog(@"Test");

}

-(void)viewDidAppear:(BOOL)animated
{

NSLog(@"Test");

}

-(void)viewDidLoad
{

NSLog(@"Test");

}
</code>

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

Ответы на вопрос(2)

This answer was rewritten/expanded to explain the 3 most important approaches (@galambalazs)

1. Blocks

Самый простой подход - использование обратного вызова.block, Это хорошо, если у вас есть толькоone listener (родительский контроллер представления), заинтересованный в увольнении. Вы даже можете передать некоторые данные с событием.

ВMainViewController.m

SecondViewController* svc = [[SecondViewController alloc] init];
svc.didDismiss = ^(NSString *data) {
    // this method gets called in MainVC when your SecondVC is dismissed
    NSLog(@"Dismissed SecondViewController");
};
[self presentViewController:svc animated:YES completion:nil];

ВSecondViewController.h

@interface MainViewController : UIViewController
    @property (nonatomic, copy) void (^didDismiss)(NSString *data);
    // ... other properties
@end

ВSecondViewController.m

- (IBAction)close:(id)sender 
{
    [self dismissViewControllerAnimated:YES completion:nil];

    if (self.didDismiss) 
        self.didDismiss(@"some extra data");
}
2. Delegation

Delegation это рекомендуемый шаблон от Apple:

Dismissing a Presented View Controller

If the presented view controller must return data to the presenting view controller, use the delegation design pattern to facilitate the transfer. Delegation makes it easier to reuse view controllers in different parts of your app. With delegation, the presented view controller stores a reference to a delegate object that implements methods from a formal protocol. As it gathers results, the presented view controller calls those methods on its delegate. In a typical implementation, the presenting view controller makes itself the delegate of its presented view controller.

MainViewController

ВMainViewController.h

@interface MainViewController : UIViewController <SecondViewControllerDelegate>
    - (void)didDismissViewController:(UIViewController*)vc;
    // ... properties
@end

Где-то вMainViewController.m (Предъявление)

SecondViewController* svc = [[SecondViewController alloc] init];
svc.delegate = self;
[self presentViewController:svc animated:YES completion:nil];

Где-то еще вMainViewController.m (сообщается об увольнении)

- (void)didDismissViewController:(UIViewController*)vc
{
    // this method gets called in MainVC when your SecondVC is dismissed
    NSLog(@"Dismissed SecondViewController");
}

SecondViewController

ВSecondViewController.h

@protocol SecondViewControllerDelegate <NSObject>
- (void)didDismissViewController:(UIViewController*)vc;
@end

@interface SecondViewController : UIViewController
@property (nonatomic, weak) id<SecondViewControllerDelegate> delegate;
// ... other properties
@end

Где-то вSecondViewController.m

[self.delegate didDismissViewController:self];
[self dismissViewControllerAnimated:YES completion:nil];

(note: the protocol with didDismissViewController: method could be reused throughout your app)

3. Notifications

Другим решением является отправкаNSNotification, Это также правильный подход, он может быть проще, чем делегирование, если вы хотите толькоnotify об увольнении без передачи большого количества данных. Но это основной случай использования, когда вы хотитеmultiple listeners для события отклонения (кроме только родительского контроллера представления).

Но обязательноalways удалить себя изNSNotificationCentre после того, как вы сделали! В противном случае вы рискуете потерпеть крах, будучи вызванным для уведомлений даже после того, как вас освободили.[editor's note]

ВMainViewController.m

- (IBAction)showSecondViewController:(id)sender 
{
    SecondViewController *secondVC = [[SecondViewController alloc] init];
    [self presentViewController:secondVC animated:YES completion:nil];

    // Set self to listen for the message "SecondViewControllerDismissed"
    // and run a method when this message is detected
    [[NSNotificationCenter defaultCenter] 
     addObserver:self
     selector:@selector(didDismissSecondViewController)
     name:@"SecondViewControllerDismissed"
     object:nil];
}

- (void)dealloc
{
    // simply unsubscribe from *all* notifications upon being deallocated
    [[NSNotificationCenter defaultCenter] removeObserver:self];
} 

- (void)didDismissSecondViewController 
{
    // this method gets called in MainVC when your SecondVC is dismissed
    NSLog(@"Dismissed SecondViewController");
}

ВSecondViewController.m

- (IBAction)close:(id)sender 
{
    [self dismissViewControllerAnimated:YES completion:nil];

    // This sends a message through the NSNotificationCenter 
    // to any listeners for "SecondViewControllerDismissed"
    [[NSNotificationCenter defaultCenter] 
     postNotificationName:@"SecondViewControllerDismissed" 
     object:nil userInfo:nil];
}

Надеюсь это поможет!

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

Пример этого можно увидеть, если вы создаете новый проект и выбираетеUtility Application шаблон.

ВАШ ОТВЕТ НА ВОПРОС