2012-03-08 3 views
2

Я думаю, что я слежу за тем, как работает делегация, here's the tutorial I followed, но я что-то испортил. Я ожидаю, что мой делегат NSLog, но это не так. Может ли кто-нибудь узнать, что мне не хватает или что-то не так?Выполнение делегирования

Мой 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: 

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

+0

это должно сработать ... попробуйте делегировать объект NSLog перед 'self.delegate cancelAddingClass' и посмотреть, не является ли оно нулевым. – Shubhank

+0

Хорошо, так что это нехорошо. Мой делегат = null. – tazboy

+0

Я думаю, что это может быть из-за слабой ссылки в объявлении делегата ... попробуйте изменить его на сильный – Shubhank

ответ

2

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

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

Я думаю, что это моя проблема, потому что я NSLogged класс addClassVC, и он сказал, что это navcontroller. Я попробовал AddClassViewController * addClassVC = [[segue destinationViewController] rootViewController]; но это дает мне предупреждение: Semantic Issue: Несовместимые типы указателей инициализация 'AddClassViewController * __ strong' с выражением типа 'UIViewController *' – tazboy

+0

Я получаю сообщение об ошибке Свойство 'rootViewController' не найдено на объекте типа 'UINavigationController *'; Вы имели в виду «topViewController»? Я также попробовал topViewController, но мое приложение разбилось. Спасибо за продолжение помощи. – tazboy

+0

К сожалению, это то, что я получаю для ответа на свой телефон, не проверяя документы ... answer updated – jrturton

-1

Все идеально. Я не видел никаких проблем. Держите точки останова повсюду и отлаживайте его.

+0

Если я брошу точки останова, что бы я искал? У меня нет никаких ошибок. Он просто работает не так, как ожидалось. – tazboy

+0

breakpoins не даст вам информации об ошибках приложения. вы можете проверить, вызван ли уважаемый метод или нет, если вы сохраняете точки останова. – Dee

+0

Если бы все, что вам нужно было посмотреть, будет ли метод вызываться, не будет ли инструкций NSLog достаточным? Я вижу, как точки останова будут полезны для понимания порядка работы вашей программы и т. Д. Я должен попробовать их больше. – tazboy

0

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

Смежные вопросы