苹果对其软件开发推荐了许多设计模式(design patterns),其中protocol是一个基本的技巧。我在学习iOS软件开发过程中基本上掌握了这一技巧,我觉得这是一种非常好的将不同classes分开又整合的一种技术方法。最近在重温学习斯坦福大学2011季新的iOS课程中,该教课老师Paul Hegarty用非常精辟的总结解释了如何使用这一技巧,参考第九课:表格用户界面(October 25, 2011)中从1:04:15开始的部分。
他提到许多新软件开发者对于如何使用protocols感到十分困惑。他将此总结为五个基本步骤,并且用实例中讲解了如何应用这五个步骤。
- 定义@protocol
- 在使用者的公共@interface(.h文件)中加一 delegate @property
- 在使用者的应用(.m文件)中使用delegate
- 在delegate的@implementation中设定delegate property
- 在delegate被确定的class中定义protocol的 method(s)
@class CalculatorProgramsTableViewController; @protocol CalculatorProgramsTableViewControllerDelegate @optional - (void)calculatorProgramsTableViewController: (CalculatorPorgramTableViewController *)sender choseProgram:(id)program; @end
然后第二步是在 controller 的.h文件中定义一个 weak id <...> delegate:
@interface CalculatorProgramsTableViewController : UITableViewController ... // Define a property delegate @property (nonatomic, weak) id<CalculatorProgramsTableViewControlerDelegate> delegate; ... @end
接着在相应的 .m 文件中, 定义这个 delegate property.
@implementation CalculatorProgramsTableViewController ... @synthesize delegate = _delegate; ... @end
第三步,在controller中,当表格中一行选择时,使用该delegate来告诉相应的program被选择:
#progma mark - UITableViewDelegate - (void)tableView:(UITableView *)tableView didSeelectRowAtIndexPath:(NSIndexPath *)indexPath { id program = [self.programs objectAtIndex:indexPath.row]; [self.delegate calculatorProgramsTableViewController:self choseProgram:porgram]; }
第四步,这个delegate是在哪设定的呢?在这个实例中是表格Controller Segue。当Segue将推出表格popup时,在这里可以告诉其controller的delegate:
@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 } }
最后第五步,在上面的controller中定义protocol的method,这样才表格中可以通过这个途径告诉哪一个program被选择:
// implement delegate method - (void)calculatorProgramsTableViewController: (CalculatorProgramsTableViewController *)sender chooseProgram:(id)program { self.calculatorProgram = program; }
“这就是五个步骤,好了!”,Paul最后结束了实例和第九课。
2 comments:
请问代码段用的是什么字体呢,很舒服
博客文章都是采用HTML,本文中的代码采用—论坛<pre>。具体的字体取决于浏览器的设定,我采用Safari,字体是monospace。
Post a Comment