次の問題が発生しました。3 つのビュー (UITableView、および 2 つのビュー コントローラー) があります。次の 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 で、fallow としてインポートしました。
#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;