第6章 helper object

一、MAC开发

        这一章主要讲的一个概念就是帮助对象,它的职能类似于你的秘书。这个概念对于我来说还是一个新概念,觉得是本章是比较重要并且难理解的一章。

       当你想要完成某件件事情时,通知帮助对象,它会帮你准备需要的东西,然后反馈给你。在这些准备工作的基础上,你就可以开始完成你想要的功能了。
       具体来说,对于前面提到的例子。helper object在控件和你自己的类之间建立了一种反馈的机制。控件是老板,你创建的类是秘书。
       例如当用户想要每次改变windows的size时,windows的宽度都是高度的2倍。为了实现这个功能,设置windows对象的helper object是appcontroller。每当windows被用户改变size时,appcontroller都会设置好宽度和高度的关系,并把这些数据反馈给windows,因此windows就能据此设置自己的size,从而实现宽度是高度2倍的效果。


        helper object这个概念一般来说叫做delegate,对于NSTableview来说也叫data source。
本章的内容主要是围绕speakline这个程序来进行的,在原来的基础上加入了helper object的实现。

       delegate 的实现机制类似于给应用程序预留借口。因为所有的类都继承与NSObject,并且由于指定了NSTableView的delegate是appcontroller。这就使得NSTableView可以调用appcontroller的函数实现来完成自己相应的处理。

举例如下,NSObject中定义了respondsToSelector函数。它用于询问delegate中是否定义了指定的selector函数。

在NSTableView的实现代码中应该有如下的代码:

// About to change to row "rowIndex"
// Set the default behavior
   BOOL ok = YES;
// Check whether the delegate implements the method
   if ([delegate respondsToSelector:@selector(tableView:shouldSelectRow:)])
   {
       // Execute the method
       ok = [delegate tableView:self shouldSelectRow:rowIndex];
   }
   // Use the return value
   if (ok)
   {
        ...actually change the selection...
   }



以上代码中的delegate实际上指的就是 appController。

challenge 1 :delegate程序


challenge 2 :data source 程序


这是第一个有自己参与一点点设计的cocoa程序,完成了之后还是有些开心的。

在基本要求的基础上,实现了table view中cell的可编辑,以及add item之后,输入框清空的小功能。并且使用xcode help中的document找到了NSTableView类中的reload函数,实现add之后,table view数据的更新显示。


二、iphone开发

        delegatedatasourcecocoa touch中有不同的含义。delegate一般指的是行为,而datasource指的是数据。

例如:在UITableViewnumberOfRowsInSectioncellForRowAtIndexPath就是datasource,而didSelectRowAtIndexPath就是datasource

         

        delegate一个很重要的用途,就是它可以在view controller之间传递数据。

整个过程看起来像这样:假设有一个黑帮团伙C1想去偷金库里的金子,但是要想进到金库里面必须先把金库里的门和柜子等打开,C1在内部讨论了几天之后,发现自己内部没有这样的人才,于是决定广发英雄帖(定义@protocal),诚聘开锁英才(在C1的类定义中,加上delegate的定义)。英雄帖的名称叫protocal,在protocal中写明了需要打开的门和锁的规格(在@protocal中定义了open(门,柜子)函数)。几天之后,江湖中人称桥王的Segue在看到这封英雄帖之后,忽然想到在黑帮C2里不是有这样的人么,上次自己家的门就是让这帮人给撬开的(C2的类符合@protocal的要求,有open(门,柜子)的函数实现)。于是,他将C2介绍给了C1(在prepareForSegue函数中,c1.delegate = c2)。

       于是第二天,C1跑去抢劫银行时,叫来C2打开了金库的门和柜子(在C1的action函数中,执行[C1.delegate open(门,柜子)])。打开一看,发现里面什么都没有,只发现有一份信。C1急忙拆开信来看,上面写着“出来混,迟早是要还的。。。”。

总结一下就是下面的5个步骤:


1. Create the @protocol
2. Add delegate @property to delegator’s public @interface
3. Use delegate property inside delegator’s implementation
4. Set the delegate property somewhere inside the delegate’s @implementation

5. Implement the protocol’s method(s) in the delegate (include <> on @interface) 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值