2013-02-20 118 views
0

我得到的下一个问题,我有3次(一个UITableView,AND2视图控制器)我提出的下一个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 2013-02-20 17:30:45

+0

我同意,'delegate'最有可能是'nil'。 – Kevin 2013-02-20 17:37:35

+0

我编辑了帖子并添加了调用代码块。以同样的方式,我从它的协议调用addViewController方法,并为它工作。 – user1792771 2013-02-20 17:37:43

回答

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 

记住你不应该保留(强)你的代表!