I am back to the course of iOS Development by Stanford University. Last week, I watched Lesson 9 Table Views(October 25, 2011). Instructor Paul Hegarty mentioned 5 steps about Delegate at 1:04:15.
He talked the confusion for new developers when they use protocols. The 5 steps are clear explanation on how to use and implement protocols. He also showed the steps in his demo.
- Create the @protocol
- Add delegate @property to delegator's public @interface
- Use delegate property inside delegator's implementation
- Set the delegate property somewhere inside the delegate's @implmentation
- Implement the protocol's method(s) in the delegate(include <> on @interface)
@class CalculatorProgramsTableViewController; @protocol CalculatorProgramsTableViewControllerDelegate @optional - (void)calculatorProgramsTableViewController:(CalculatorPorgramTableViewController *)sender choseProgram:(id)program; @end
In CalculatorProgramsTableViewController.h, the delegate is created in the controller as weak id <...> delegate:
@interface CalculatorProgramsTableViewController : UITableViewController ... // Define a property delegate @property (nonatomic, weak) id<CalculatorProgramsTableViewControlerDelegate> delegate; ... @end
In its .m file, the delegate property is defined by @synthesize delegate = _delegate.
@implementation CalculatorProgramsTableViewController ... @synthesize delegate = _delegate; ... @end
In the event of a row cell being selected, the delegate is used:
#progma mark - UITableViewDelegate - (void)tableView:(UITableView *)tableView didSeelectRowAtIndexPath:(NSIndexPath *)indexPath { id program = [self.programs objectAtIndex:indexPath.row]; [self.delegate calculatorProgramsTableViewController:self choseProgram:porgram]; }
Next, where the delegate is set? in the event of controller segue. The delegate method is implemented in the controller:
@implementation CalculatorGraphViewController ... - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"Show Favorite Graphics"]) { NSArray * programs = [[NSUserDefaults standardUserDefaults] objectForKey:FAVORITES_KEY]; [segue.destinationViewController setPrograms:programs]; [segue.destinationViewController setDelegate:self]; // set delegate } }
Lastly, in order for the graphic view controller to know the change of a program, the controller has to implement the delegate method. The protocol method will be called when the delegate sends out its message: a row in table view being selected:
// in .h file, the protocal delegate is defined as the controller's interface @interface CalculatorGraphViewController : NSOjbect <CalculatorProgramsTableViewControllerDelegate> ... @end //In .m The protocol method is implemented - (void)calculatorProgramsTableViewController:(CalculatorProgramsTableViewController *)sender chooseProgram:(id)program { self.calculatorProgram = program; }
"That's all we need. OK!", Paul said.
0 comments:
Post a Comment