【问题标题】:What exactly does delegate do in xcode ios project?委托在 xcode ios 项目中究竟做了什么?
【发布时间】:2011-11-05 03:41:08
【问题描述】:

我刚刚学习 iPhone 应用程序开发,但我很难理解委托的实际含义?谁能举例告诉我它的作用和重要性?感谢您的帮助!

【问题讨论】:

标签: iphone objective-c xcode ipad delegates


【解决方案1】:

从概念上理解这是一个关键概念,因此在技术细节之前先弄清楚如何思考它很重要。简单地说,委托就是一个回调。

使用委托的两种主要场景:

  1. 类或控件想要抽象出有关如何工作的详细信息(例如检索数据)。
  2. 允许其他人将代码挂接到管道中。

示例: UITableView - 表格视图只是一个知道如何呈现单元格列表的控件。它处理渲染、滚动等所有繁重的工作……但是,它不知道如何加载数据。因此,您实现了一个数据源委托,该委托具有获取给定行的单元格数据的方法等......这让您很容易。您只需使用控件并插入数据的细节。 UITableView 将为您做所有事情……只需回答几个具体问题即可。一位代表回答了这几个具体问题。

文本控件 - 您将文本控件添加到视图中,瞧!你可以输入它,一切都很好。但是,如果您想在他们开始输入或完成输入时做些什么呢?好吧,文本控件提供了一个委托,其方法允许您连接到文本控件的执行管道。它允许文本控件为您做所有事情,并允许您在需要的地方插入代码。很多时候,有办法插入代码来决定是否允许某事。控件会回电询问,我应该可以做 x 吗?您可以插入代码并影响行为。

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

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

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

在控件或类中,为消费者提供一种方法,将委托数据源类提供给我们,该类将回答控件提出的问题。此时,控件是纯控件。它对您如何获取数据一无所知。它要求一个实现合同/协议的对象(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];
}

【讨论】:

    【解决方案2】:

    委托是另一个类可以向其传递消息的对象。在实践中,委托类必须符合委托协议。

    例如,我们将采用表视图控制器的子类。这是您的表格视图的委托。首先,您通过这样做来定义它是一个表视图委托:

    MyTableViewController : UITableViewController <UITableViewDelegate>
    

    这表示MyTableViewController 类是UITableViewController 的子类,并且符合UITableViewDelegate 协议。

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

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

    因此,接受点击事件的对象(表格视图)将单元格已被点击的消息传递给委托对象(在本例中为您的 MyTableViewController 对象)。

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

    但是cellForRowAtIndexPath 是必需的,没有它您的应用将无法编译。

    我希望这对您有所帮助并且简单明了。如果您需要更多信息,请告诉我。

    【讨论】:

      【解决方案3】:

      委托只是从某事中获取回调的方式。您将委托(指向符合协议的对象的指针)传递给某物,当它为您提供新数据或发生事件时,某物对委托进行方法调用。

      例如,当事件发生时,例如您的应用程序被置于后台或应用程序即将终止,UIApplication 对象将调用您的应用程序委托以告知它。当 CLLocationManager 有一个新的 GPS 位置时,将调用您的代理将新位置传递给它。 UITableViews 调用它们的委托来让 UITableViewCells 显示在表格中。在 iOS 中委托有很多用途。

      【讨论】:

        猜你喜欢
        • 2021-05-15
        • 2017-07-22
        • 2011-06-18
        • 2020-09-21
        • 2012-07-23
        • 2016-09-10
        • 2023-03-15
        • 2012-10-17
        • 2021-06-04
        相关资源
        最近更新 更多