委托在xcode ios项目中做了什么?

时间:2011-08-27 16:11:19

标签: iphone objective-c xcode ipad delegates

我刚刚学习iPhone应用程序开发,但我很难理解委托实际意味着什么?任何人都可以告诉我它的作用是什么以及它有多重要?谢谢你的帮助!

3 个答案:

答案 0 :(得分:41)

这是概念性理解的关键概念,因此了解如何在技术细节之前考虑它是很重要的。简而言之,代表是一个回调。

使用委托的两个主要方案:

  1. 类或控件想要抽象出有关如何工作的详细信息(如检索数据)。
  2. 允许其他人将代码挂钩到管道中。
  3. 实施例: UITableView - 表视图只是一个知道如何呈现单元格列表的控件。它处理渲染,滚动等所有繁重的工作......但是,它不知道如何加载数据。因此,您实现了一个数据源委托,该委托具有获取给定行的单元格数据的方法等...这使您很容易。您只需使用控件并插入数据的详细信息即可。 UITableView将为您完成所有工作......只需回答几个具体问题即可。代表回答了这几个具体问题。

    文本控件 - 您可以在视图中添加文本控件,瞧!你可以输入它,一切都很好。但是如果你想在他们开始打字或打字时想要做些什么呢?好吧,文本控件为委托提供了一些方法,允许您挂钩文本控件的执行管道。它允许文本控件为您完成所有操作,并允许您在需要的地方插入代码。很多时候,有一种方法可以插入代码来决定是否允许某些内容。控件将回调并询问,我能做x吗?您可以插入代码并影响行为。

    如果您正在创建一个控件或类,您可以创建自己的协议,数据源代理等...这样您的控件就可以专注于做广告宣传。例如,假设您要创建任务控件。你可以:

    首先,创建一个合同。嘿,如果你要为我的控制提供数据,这些是我要问你的问题。我会从那里拿走它...在这种情况下,我会问你任务的数量,我会给你一个给定行号的任务。

    @protocol XXTaskBoardDelegate <NSObject>
    -(NSInteger*)getTaskCount;
    -(XXTask*)getTaskForRow:(NSInteger*)rowNumber;
    @end
    

    在控件或类中,为消费者提供一种方法来为我们提供委托数据源类,该类将回答控件将要求的问题。此时,控件是纯粹的控件。它对您如何获取数据一无所知。它要求实现合同/协议的对象(id)。 ID

    @implementation XXTaskBoard
    - (void)setDelegate:(id<XXTaskBoardDelegate>)newDelegate
    {
        // the control stores the delegate so it can callback and ask you questions.
    }
    

    然后,对于委托类,在标头声明您实现该正式协议 并在实现m文件中提供代码。

    @interface AppController : NSObject<XXTaskBoardDelegate> 
    {
        //...
    }
    

    然后,在实现中实现它

    @implementation AppController
    - (NSInteger*)getTaskCount
    {
        return [model queryTaskCount];
    }
    
    - (XXTask*)getTaskForRow:(NSInteger*)rowNumber
    {
        return [[model tasks] getItem:(NSInteger*)rowNumber];
    }
    

答案 1 :(得分:10)

委托是另一个类可以传递消息的对象。实际上,委托类必须符合委托协议。

例如,我们将采用表视图控制器的子类。这是表视图的委托。首先,通过执行以下操作来定义它是表视图委托:

MyTableViewController : UITableViewController <UITableViewDelegate>

这表示类MyTableViewControllerUITableViewController的子类,UITableViewDelegate协议的CONFORMS。

设置[tableView setDelegate:self](或在IB中定义它)然后将self对象传递给tableview,以便tableview向其发送消息。

它发送的主要信息是didSelectRowAtIndexPath消息,它告诉您的班级用户已按下表格视图单元格。

因此,获取click事件的对象(表视图)会传递单元格被单击到委托对象的消息(在本例中是您的MyTableViewController对象)。

存在委托协议,以便您可以确保委托对象具有处理邮件的必要方法。委托协议中的方法可以是@optional或强制执行。不必定义任何可选的方法。在MyTableViewController课程中,方法didSelectRowAtIndexPath是可选的 - 您不必拥有它。如果表视图没有找到方法,它就不会调用它。

然而,cellForRowAtIndexPath是必要的,如果没有它,您的应用程序将无法编译。

我希望这会对您有所帮助并且直截了当。如果您需要更多信息,请告诉我。

答案 2 :(得分:3)

代表只是从某些东西获得回调的方式。您将委托(指向符合协议的对象的指针)传递给某个东西,并且当它为您提供新数据时,或者当事件发生时,某个事件会对该委托进行方法调用。

例如,当事件发生时,就像您的应用程序被放入后台或应用程序即将终止UIApplication对象将调用您的应用程序委托让它知道。当CLLocationManager具有新的GPS位置时,将调用您的代理人将其传递给新位置。 UITableViews调用它们的委托来获取UITableViewCells以显示在表中。 iOS中的代理有很多用途。