zoukankan      html  css  js  c++  java
  • iOS 代理的具体使用

    最近看了一个代理的使用文档,觉着写的很好,记录一下

    1.     创建一个 delegate;

    2.    委托者声明一个delegate;

    3.    委托者调用delegate内的方法(method);

    4.    被委托者设置delegate,以便被委托者调用;

    5.    被委托者实现Delegate 所定义的方法。

    1.1    第一步: 创建一个delegate

    在 .h 文件中,  通过 @protocol 创建一个 delegate:

    @protocol CalculatorProgramsTableViewControllerDelegate

    @optional

    - (void)calculatorProgramsTableViewController:  (CalculatorPorgramTableViewController *)sender   choseProgram:(id)program;

    @end

    代码解释:

    @protocol CalculatorProgramsTableViewControllerDelegate

    用来创建一个delegate。  这个delegate 中有一个方法:

    (void)calculatorProgramsTableViewController

    @optional 表明,这个方法是不要求一定实现,是可选的。

    小贴士:

    这里需明确一个概念, 虽然通过@protocol 定义了一个delegate,但不能说, delegate 就是protocol。  前面提到过,delegate是一种架构设计模式。 在iOS中,它是通过@protocol 来实现的。

     

    1.2    第二步: 委托者声明一个delegate

    在TableView 的 .h 文件中 (CalculatorProgramsTableViewController.h), 将之前创建的delegate 通过@property 进行声明。 代码如下:

    @interface CalculatorProgramsTableViewController : UITableViewController

    ...

    // Define a property delegate

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

    ...

    @end

    添加这几行代码后 , TableView 便拥有了Delegate。 有了Delegate, TableView就可以发消息了。 仅仅是可以发消息了,但还没有发。 下一步,Tableview 开始发送消息。

     1.3    第三步:委托者调用delegate内的方法

    我们的目标是:  当在TableView 上选择不同的函数时, TableView 将这个所选定的函数,告知绘制函数图形的GraphicView。

    这一步,TableView  通过调用delegate的方法,发送消息。代码实现如下:

    #progma mark - UITableViewDelegate

    - (void)tableView:(UITableView *)tableView

        didSeelectRowAtIndexPath:(NSIndexPath *)indexPath

    {

      id program = [self.programs objectAtIndex:indexPath.row];

      [self.delegate calculatorProgramsTableViewController:self

                                              choseProgram:porgram];

    }

    代码解释:

    注意到 高亮部分的 self.delegate 了吧。 UITableView 就是通过这个之前定义的delegate 发送消息的。具体做法是: UITableViewController 调用delegate 中所定义的函数。通过这个函数的调用,  实现了消息的发送。但发到哪里去了,还不得而知。这是因为, self.delegate 还没赋值呢。  

    接下来,要做的是: 将  self.delegate  设置为GraphicView。

    1.4     被委托者设置delegate,以便被委托者调用; 

    前面谈到, UITableViewController 中的self.delegate 还没有赋值。既然TableView 想把值传给Graphicview,  那就应该在calculatorGraphViewController.m 文件中设置delegate。 也就是说,让Graphicview 成为Tableview的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

      }

    }

    代码解释:

    但点击Graphicview 右上角的button 时, 会弹出一个Tableview。同时,在这段代码的最后一行,将CalculatorGraphViewController 设置为Tableview 的delegate。

    通过这个设置, Tableview便可以调用Graphicview 所遵循的delegate 的的方法。

    Delegate 的这个方法还没实现呢,  赶紧实现它吧。

    1.5    被委托者实现Delegate 所定义的方法。

    还记得那个神秘的 <> 吧。 通过以下代码,让GraphicViewController 来遵循这个delegate。  

    // .h to implement the protocol

    @interface CalculatorGraphViewController :NSObject

         <CalculatorProgramsTableViewControllerDelegate>

    ...

    @end

    这是delegate使用的最后一步了, 我们在segue的controller 文件中,实现这个protocol所定义的方法。代码如下:

    // implement delegate method

    - (void)calculatorProgramsTableViewController:(CalculatorProgramsTableViewController *)sender

                                    chooseProgram:(id)program

    {

      self.calculatorProgram = program;

    }

    1.6    小结

    通过以上delegate 五部曲的演示,我们对delegate的机制,清楚些了吧。 Delegate 实现了不同视图之间的数据交互。 Delegate 属于事件驱动的范畴。只有当某一事件触发时,delegate 才被调用。

    在Cocoa 框架中, 虽然数据存储和访问的方式有多种, 但delegate 所独有的数据交互模式是无可替代的。

    注:以上来自斯坦福iOS 教学。 这是一个经典的 delegate 应用案例。

  • 相关阅读:
    深度探索C++对象模型之第一章:关于对象之对象的差异
    深度探索C++对象模型之第一章:关于对象之关键词所引起的差异
    C++之constexpr
    STL之空间配置器
    10泛型算法
    C++之指针与数组区别
    数学 之 hdu 4861
    贪心 之 hdu 4864
    01背包(求前一个的最大价值-->求前K个的最大价值) 之 hdu 2639
    01背包(体积为负,改变区间) 之 poj 2184
  • 原文地址:https://www.cnblogs.com/LynnAIQ/p/5908653.html
Copyright © 2011-2022 走看看