0

更新がある場合やオブジェクトを追加する必要がある場合に通知を受けるために、2つのクラス間の委任を使用しています。最初のクラスはUITableViewControllerのサブクラスであり、2番目のクラスはUIViewControllerのサブクラスです。最初のクラスには、テーブルビューにオブジェクトを追加するためのプラス(addButton)があります。2番目のクラスは、追加ボタンが押されたときに最初のクラスが移動するビューです。したがって、View Controllerクラスで、.hファイルにプロトコルを追加しました。

@protocol ViewControllerDelegate <NSObject>

- (void) addViewControllerDelegate:(ViewController *)controller didUpdateEvent:(Event *) event;

@end

そして私はデリゲート@propetyを追加しました:

@property (weak, nonatomic) id <SSAddViewControllerDelegate> delegate;

.mファイルで、保存ボタンが押されたときにトリガーされるIBActionメソッドに次を追加しました。

[self.delegate addViewControllerDelegate:self didUpdateEvent: event];

ここで、テーブルビューコントローラークラスに戻り、追加した.hファイルと.mファイルに次のメソッドを追加しました。

- (void) addViewControllerDelegate:(ViewController *)controller didUpdatEvent:(Event *)event{
    [self saveNewEntry:event];
    NSLog(@"DELEGATE");
}

問題:機能していません。私はやるべきことはすべて作ったと思いますが。

注:ここでクラスの名前を変更したので、ViewControllerというクラスはありませんでした。saveNewEntryは、イベントオブジェクトを配列に追加するために使用され、nslogが存在するため、メソッドに入ったかどうかを知ることができます。

//----------------------------------より実際のコード----------- ------------------- 2番目のクラス(ビューコントローラー)それぞれ.hと.m

@class Course;
@class SSAddViewController;

@protocol SSAddViewControllerDelegate;

@interface SSAddViewController : UIViewController <UITextFieldDelegate>
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@property (weak, nonatomic) id <SSAddViewControllerDelegate> delegate;
@end

@protocol SSAddViewControllerDelegate <NSObject>

- (void) addViewControllerDelegate:(SSAddViewController *)controller didUpdateCourse:(Course *) course;

@end
@class Course;
@class SSAddViewController;

@protocol SSAddViewControllerDelegate;

@interface SSAddViewController : UIViewController <UITextFieldDelegate>
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@property (weak, nonatomic) id <SSAddViewControllerDelegate> delegate;
@end

@protocol SSAddViewControllerDelegate <NSObject>

- (void) addViewControllerDelegate:(SSAddViewController *)controller didUpdateCourse:(Course *) course;

@end

- (void) saveNewEntry
{
    SSAppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
    NSManagedObjectContext *context = [appDelegate managedObjectContext];
    Course *course = (Course *) [NSEntityDescription insertNewObjectForEntityForName:@"Course" inManagedObjectContext:context];
    NSLog(@"YES");
    [course setCourseName:self.nameTextField.text];
    [course setCourseCredits:[NSNumber numberWithInt:[self.creditstextField.text intValue]]];
    [course setCourseChapters:[NSNumber numberWithInt:[self.chaptersTextField.text intValue]]];

    if (hasChanges) {
        [self.delegate addViewControllerDelegate:self didUpdateCourse:course];
    }
}

ファーストクラス(テーブルビュー)それぞれ.hと.m:

@interface SSCoursesViewController : UITableViewController <SSAddViewControllerDelegate>




- (void) addViewControllerDelegate:(SSAddViewController *)controller didUpdateCourse:(Course *)course{
    [self saveNewEntry:course];
    NSLog(@"DELEGATE");
}
4

2 に答える 2

0

実際にコードを設定しましたSSAddViewControllerDelegate = self;か?

于 2013-03-05T19:02:55.873 に答える
0

SSAddViewControllerはどこで作成されますか?ストーリーボードの一部としてセグエを使用していますか、それとも直接作成していますか?

セグエを使用している場合は、SSCoursesViewControllerにprepareForSequeを実装する必要があります

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    SSAddViewController *ssavc = (SSAddViewController *)[segue destinationViewController];

    ssavc.delegate = self;

}

SSAddViewControllerを直接作成している場合は、直接設定できます。

私は今Macの前に座っていませんが、上記のコードはほぼ正しいです。

于 2013-03-05T20:07:14.037 に答える