Sunday, March 18, 2012

iOS软件开发技巧:使用protocol的基本步骤

苹果对其软件开发推荐了许多设计模式(design patterns),其中protocol是一个基本的技巧。我在学习iOS软件开发过程中基本上掌握了这一技巧,我觉得这是一种非常好的将不同classes分开又整合的一种技术方法。最近在重温学习斯坦福大学2011季新的iOS课程中,该教课老师Paul Hegarty用非常精辟的总结解释了如何使用这一技巧,参考第九课:表格用户界面(October 25, 2011)中从1:04:15开始的部分。

他提到许多新软件开发者对于如何使用protocols感到十分困惑。他将此总结为五个基本步骤,并且用实例中讲解了如何应用这五个步骤。



  1. 定义@protocol
  2. 在使用者的公共@interface(.h文件)中加一 delegate @property
  3. 在使用者的应用(.m文件)中使用delegate
  4. 在delegate的@implementation中设定delegate property
  5. 在delegate被确定的class中定义protocol的 method(s)


Paul在计算器实例中介绍了如何实施这五个步骤。第一步:CalculatorProgramsTableViewController.h 文件中定义protocol CalculatorProgramsTableViewControllerDelegate 为:

@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:

xiaobo zhuge said...

请问代码段用的是什么字体呢,很舒服

David Chu said...

博客文章都是采用HTML,本文中的代码采用—论坛<pre>。具体的字体取决于浏览器的设定,我采用Safari,字体是monospace。

Post a Comment