2013-02-20 2 views
0

меня следующая проблема у меня есть 3 просмотров (UITableView, and2 View Controller) я сделал следующие протоколы: 2 AddViewControllerDelegate и ViewAlarmControllerDelegate: AddViewController.h:методы из протокола не называется

@protocol AddViewControllerDelegate <NSObject> 

- (void)addAlarm:(AlarmObject *)alarm; 

@end 

@interface AddViewController : UIViewController 
{ 
    id <AddViewControllerDelegate> delegate; 
} 
@property (retain) id delegate; 

ViewAlarmController.h:

@protocol ViewAlarmControllerDelegate <NSObject> 

- (void)changeAlarm:(AlarmObject *)alarm atIndex:(int) alarmID; 
- (void)deleteAlarmAtIndex:(int) alarmID; 

@end 

@interface ViewAlarmController : UIViewController 
{ 
    id <ViewAlarmControllerDelegate> delegate; 
} 

@property (retain) id delegate; 

Тогда в HomeViewController.h я импортирован как пар:

#import "AddViewController.h" 
#import "ViewAlarmController.h" 
#import "AlarmObject.h" 
@interface HomeViewController : UITableViewController <AddViewControllerDelegate, ViewAlarmControllerDelegate> 

И у меня есть следующая декларация методов в HomeViewController.m

- (void)addAlarm:(AlarmObject *)alarm{ 
    [self.items addObject:alarm]; 
    [self.tableView reloadData]; 
    NSLog (@"added"); 
} 

- (void)deleteAlarmAtIndex:(int)alarmID{ 
    NSLog(@"alarmID: %d", alarmID); 
    [self.items removeObjectAtIndex:alarmID]; 
    NSLog(@"items: %@", items); 
    [self.tableView reloadData]; 
} 

- (void)changeAlarm:(AlarmObject *)alarm atIndex:(int)alarmID{ 
    NSLog(@"change"); 
} 

ViewAlarmController.m призвание метод кодового блока протокольного:

- (IBAction)save:(id)sender { 
    AlarmObject* alarmObj = [[AlarmObject alloc]init]; 
    if(![self.alarmNameField.text isEqual: @""]){ 
     [alarmObj setValue:self.alarmNameField.text forKey:@"alarmName"]; 
     NSLog (@"change alarm id = %d", alarmID); 
     [self.delegate changeAlarm:alarmObj atIndex:alarmID]; 
    } 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

- (IBAction)reverse:(id)sender { 
    alarmNameField.text = [alarm valueForKey:@"alarmName"]; 
} 

- (IBAction)deleteAlarm:(id)sender { 
    NSLog (@"delete alarm id: %d",alarmID); 
    [self.delegate deleteAlarmAtIndex:alarmID]; 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

Проблема заключается в том, что addAlarm работает, но когда я перейдите в ViewAlarm и нажмите кнопку, чтобы удалить или сохранить изменения. deleteAlarmAtIndex и методы changeAlarm не вызываются.

Проблема заключалась в следующем методе:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 
    if ([segue.identifier isEqualToString:@"addAlarmSegue"]){ 
     AddViewController *avc = segue.destinationViewController; 
     avc.delegate = self; 
    }else if ([segue.identifier isEqualToString:@"viewAlarmSegue"]){ 
     NSIndexPath *selectedRowIndex = [self.tableView indexPathForSelectedRow]; 
     ViewAlarmController *vac = segue.destinationViewController; 
     [vac getObject:[self.items objectAtIndex:selectedRowIndex.row] withId:selectedRowIndex.row]; 

     vac.delegate = self; 
    } 
} 

Я не писал vac.delegate = self;

+3

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

+0

Согласен, 'делегат', скорее всего,' nil'. – Kevin

+0

Я отредактировал сообщение и добавил блок кодового кода. таким же образом я вызвал в addViewController метод из его протокола и для этого он работал. – user1792771

ответ

0

Убедитесь, что объект, который должен сообразуется с протоколом не nil

My1Object *a = [My1Object new]; 
My2Object <Myprotocol> *b = [My2Object new]; 

a.delegate = b; 

@interface My1Object <MyProtocol> 

@property (nonatomic, weak /* or 'unsafe_unretained' for iOS less than 5.0*/) id <MyProtocol> delegate; 

@end 

@implementation My1Object 

... 



- (void)somethingHappened { 
    // just for check as I said: 
    NSLog(@"self.delegate = %@", self.delegate); // make sure this is not nil! 
    if ([self.delegate respondsToSelector:@selector(myProtocolMethod:)]) { 
     [self.delegate myProtocolMethod:self]; 
    } 
} 

... 

@end 

Запомнить что вы не должны сохранять (сильного) своего делегата!

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