gpt4 book ai didi

iphone - 我应该在哪里放置委托(delegate)方法以及如何调用它们?

转载 作者:行者123 更新时间:2023-11-28 22:56:23 25 4
gpt4 key购买 nike

作为一名新的 iOS 开发人员,我终于偶然发现了委托(delegate)。我正在尝试遵循教程:http://gabriel-tips.blogspot.com/2011/05/input-accessory-view-how-to-add-extra.html , 但是我很难理解我应该把实际的委托(delegate)方法放在哪里。

其次,有人介意提供一个关于如何调用委托(delegate)方法的简单解释吗?

谢谢!

最佳答案

委托(delegate)只是一个同意为另一个类工作的类。委托(delegate)方法由委托(delegate)类调用。因此,委托(delegate)必须提供适当方法的实现。让我们用 TableView 制作一个简单的 View Controller 。

// MyViewController.h
@interface MyViewController : UIViewController <UITableViewDelegate>
@property (nonatomic, retain) UITableView *myTableView;
@end

在 MyViewController.h 文件中,我已将我的 View Controller 声明为 UITableViewDelegate 类型的委托(delegate)(这实际上意味着它实现了 UITableViewDelegate 协议(protocol)。稍后会详细介绍)。因此,我同意响应对我的 View Controller 的请求。请求将来自名为 myTableView 的 TableView 。然而,仅仅声明我遵守 UITableViewDelegate 并不能使我的 View Controller 成为任何东西的委托(delegate)。我必须直接指定:

// MyViewController.m
#import "MyViewController.h"

@implementation MyViewController

- (void)loadView
{
myTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
myTableView.delegate = self;
self.view = myTableView;
}

@end

这里我特意将MyViewController设置为myTableView的delegate。现在,无论何时 TableView 想要要求它的委托(delegate)做某事,它都会将该消息发送到我的 View Controller 。因此,MyViewController 必须提供适当委托(delegate)方法的实现:

// MyViewController.m
#import "MyViewController.h"

@implementation MyViewController

- (void)loadView
{
myTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
myTableView.delegate = self;
self.view = myTableView;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"Selected section:%i row:%i", indexPath.section, indexPath.row);
}

@end

我在这里为委托(delegate)方法 tableView:didSelectRowAtIndexPath: 提供了一个实现:myTableView 将在适当的时候(用户选择一行)调用它。

在这里您可以找到 UITableViewDelegate 中定义的所有委托(delegate)方法。有些是必需的,有些是可选的:

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UITableViewDelegate_Protocol/Reference/Reference.html

为了成为类的委托(delegate),您应该知道需要为哪些方法提供实现。

如果您想创建自己的委托(delegate)定义,您需要创建一个新协议(protocol)。您不保留您的委托(delegate)(请参阅属性声明),因为这会创建一个保留周期:

// MyViewController.h
@class MyViewController;

@protocol MyViewControllerDelegate
- (void)viewController:(MyViewController *)viewController didChangeSelection:(NSIndexPath *)newIndexPath;
@end

@interface MyViewController : UIViewController <UITableViewDelegate>
@property (nonatomic, retain) UITableView *myTableView;
@property (nonatomic, assign) id<MyViewControllerDelegate> delegate;
@end

这里我们创建了一个新的协议(protocol)。任何想要响应 viewController:didChangeSelection: 消息的类现在都可以这样做。就像上面的 TableView 一样,它会将委托(delegate)设置为自身,然后实现该方法。现在您有了一个委托(delegate),您可以在适当的时候调用该方法。

// MyViewController.m
#import "MyViewController.h"

@implementation MyViewController

- (void)loadView
{
myTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
myTableView.delegate = self;
self.view = myTableView;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"Selected section:%i row:%i", indexPath.section, indexPath.row);

indexPath = [NSIndexPath indexPathForRow:1 inSection:0];
[self.delegate viewController:self didChangeSelection:indexPath];
}

@end

现在委托(delegate)可以接收消息并在知道我的 View Controller 更改了选择的情况下做它想做的事。

关于iphone - 我应该在哪里放置委托(delegate)方法以及如何调用它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10709786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com