0

次の問題が発生しました。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;

4

1 に答える 1

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

デリゲートを保持 (強力) してはならないことに注意してください。

于 2013-02-20T17:52:17.517 に答える