呼出し元クラス(カスタムのプロトコルに準拠)
やること:
1.プロトコルの設定
2.プロトコルメソッドの実装
呼出しクラス(カスタムのプロトコルを定義)
やること:
1.プロトコルの宣言
2.delegateの宣言
3.プロトコルメソッドの宣言
カスタムのプロトコルの使い方
呼出しクラス
やること:
1.プロトコルの宣言
2.delegateの宣言
3.プロトコルメソッドの宣言
- //プロトコルの宣言
- @protocol RecipeAddDelegate;
- @class Recipe;
- @interface RecipeAddViewController : UIViewController <uitextfielddelegate> {
- @private
- Recipe *recipe;
- UITextField *nameTextField;
- //delegateを宣言
- id <recipeadddelegate> delegate;
- }
- @property(nonatomic, retain) Recipe *recipe;
- @property(nonatomic, retain) IBOutlet UITextField *nameTextField;
- @property(nonatomic, assign) id <recipeadddelegate> delegate;
- - (void)save;
- - (void)cancel;
- @end
- //プロトコルのメソッドを定義
- @protocol RecipeAddDelegate <nsobject>
- // recipe == nil on cancel
- - (void)recipeAddViewController:(RecipeAddViewController *)recipeAddViewController didAddRecipe:(Recipe *)recipe;
- @end
- </nsobject></recipeadddelegate></recipeadddelegate></uitextfielddelegate>
実装部は長いのでいるとこだけ。
プロトコルメソッドを呼び出すだけ、実装はしなくてよい。実装はプロトコルに準拠した呼出しもとクラスで行う。
これでプロトコルを経由して呼出し元のメソッドを呼び出す。
- - (void)save {
- recipe.name = nameTextField.text;
- NSError *error = nil;
- if (![recipe.managedObjectContext save:&error]) {
- NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
- abort();
- }
- //プロトコルを経由してメソッドを呼び出す。メソッドの実装は呼出し元で
- [self.delegate recipeAddViewController:self didAddRecipe:recipe];
- }
呼出し元
やること:
1.プロトコルの設定
2.プロトコルメソッドの実装
インターフェース
- #import "RecipeAddViewController.h"
- @class Recipe;
- @class RecipeTableViewCell;
- @interface RecipeListTableViewController : UITableViewController <recipeadddelegate, nsfetchedresultscontrollerdelegate=""> {
- @private
- NSFetchedResultsController *fetchedResultsController;
- NSManagedObjectContext *managedObjectContext;
- }
- @property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
- @property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
- - (void)showRecipe:(Recipe *)recipe animated:(BOOL)animated;
- - (void)configureCell:(RecipeTableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath;
- @end
- </recipeadddelegate,>
実装部
プロトコルのメソッドを実装する。
- #pragma mark -
- #pragma mark Recipe support
- - (void)add:(id)sender {
- //ここは呼出しメソッド。ここから呼出しクラスを起動してdelegateする。
- RecipeAddViewController *addController = [[RecipeAddViewController alloc] initWithNibName:@"RecipeAddView" bundle:nil];
- addController.delegate = self;
- Recipe *newRecipe = [NSEntityDescription insertNewObjectForEntityForName:@"Recipe" inManagedObjectContext:self.managedObjectContext];
- addController.recipe = newRecipe;
- UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:addController];
- [self presentModalViewController:navigationController animated:YES];
- [navigationController release];
- [addController release];
- }
- //プロトコル実装部 dismissModalViewControllerでモーダルを除去する。
- - (void)recipeAddViewController:(RecipeAddViewController *)recipeAddViewController didAddRecipe:(Recipe *)recipe {
- if (recipe) {
- // Show the recipe in a new view controller
- [self showRecipe:recipe animated:NO];
- }
- // Dismiss the modal add recipe view controller
- [self dismissModalViewControllerAnimated:YES];
- }
- - (void)showRecipe:(Recipe *)recipe animated:(BOOL)animated {
- // Create a detail view controller, set the recipe, then push it.
- RecipeDetailViewController *detailViewController = [[RecipeDetailViewController alloc] initWithStyle:UITableViewStyleGrouped];
- detailViewController.recipe = recipe;
- [self.navigationController pushViewController:detailViewController animated:animated];
- [detailViewController release];
- }