меня следующая проблема у меня есть 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;
Важно то, где вы устанавливаете делегат, и независимо от того, является ли оно нулевым, когда вы совершаете вызовы этих функций. Вы хотели бы опубликовать это, так как это, вероятно, ваша проблема. – rooster117
Согласен, 'делегат', скорее всего,' nil'. – Kevin
Я отредактировал сообщение и добавил блок кодового кода. таким же образом я вызвал в addViewController метод из его протокола и для этого он работал. – user1792771