Внедряющая делегация - PullRequest
       9

Внедряющая делегация

2 голосов
/ 08 марта 2012

Я думаю, что следую за тем, как работает делегирование, вот учебник, которому я следовал , но я где-то напутал. Я ожидаю своего делегата в NSLog, но это не так. Кто-нибудь может узнать, что я пропускаю или делаю неправильно?

My MainViewController.h :

@interface MainViewController : UITableViewController < AddClassDelegate >

MainViewController.m :

- (void)cancelAddingClass {
    NSLog(@"Canceled Yo");
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

/*
 When a row is selected, the segue creates the detail view controller as the destination.
 Set the detail view controller's detail item to the item associated with the selected row.
 */
if ([[segue identifier] isEqualToString:@"addClassSegue"]) {

    UINavigationController *nc = (UINavigationController *)segue.destinationViewController;
    AddClassViewController *addClassVC = (AddClassViewController *)[nc.viewControllers objectAtIndex:0];
    addClassVC.delegate = self;
}

Мой модальный контроллер вида AddClassViewController.h :

@protocol AddClassDelegate <NSObject>
- (void)cancelAddingClass;
@end

@interface AddClassViewController : UITableViewController

@property (weak, nonatomic) id< AddClassDelegate > delegate;

- (IBAction)cancelButtonPressed:(id)sender;

AddClassViewController.m

@synthesize delegate;

- (IBAction)cancelButtonPressed:(id)sender {
    [self.delegate cancelAddingClass];
}

cancelButtonPressed: 

подключен к кнопке «Отмена» модального вида в раскадровке.

Ответы [ 3 ]

2 голосов
/ 08 марта 2012

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

AddClassViewController *addClassVC = [segue destinationViewController];
addClassVC.delegate = self;
NSLog(@"segued");

Вы встроили свой контроллер модального вида в контроллер навигации?Если это так, destinationViewController предоставляет вам контроллер навигации, а не AddClassViewController.Проверьте, какой класс addClassVC на самом деле находится в отладчике.

Если это навигационный контроллер, нет проблем, вам просто нужно перейти к вашему фактическому VC, используя свойство .viewControllers.В нескольких строках, чтобы было проще понять:

UINavigationController *nc = (UINavigationController *)segue.destinationViewController;
AddClassViewController *addClassVC = (AddClassViewController *)[nc.viewControllers objectAtIndex:0];
addClassVC.delegate = self;

Вы можете сделать это в меньшем количестве строк, но это беспорядок приведения и вложенных скобок, который сложнее отладить.

0 голосов
/ 08 марта 2012

Возможно ли освобождение вашего основного контроллера вида?Это установит слабую ссылку на nil, и сообщение, которое вы отправите своему делегату, будет просто проигнорировано, потому что вы будете отправлять сообщения nil.

0 голосов
/ 08 марта 2012

Все идеально. Я не видел никаких проблем. Сохраняйте точки останова везде и отлаживайте их.

...