Objective-C 中的委托

Posted

技术标签:

【中文标题】Objective-C 中的委托【英文标题】:Delegate in Objective-C 【发布时间】:2014-02-13 11:40:42 【问题描述】:

我是 Objective-C 的新手,我正在努力理解委托。我已经搜索和阅读了很多,但没有什么能真正帮助我理解。我认为理解这一点的最佳方法可能是使用示例应用程序提出问题。

我正在尝试创建一个成绩计算器应用程序来测试我的技能。这是我的文件:

mainTableViewController.h

#import <UIKit/UIKit.h>

@interface mainTableViewController : UITableViewController

@end

mainTableViewController.m

#import "mainTableViewController.h"
#import "addLectureViewController.h"


@interface mainTableViewController ()

@end

@implementation anaTableViewController

- (id)initWithStyle:(UITableViewStyle)style

    self = [super initWithStyle:style];
    if (self) 
        // Custom initialization
    
    return self;


- (void)viewDidLoad

    [super viewDidLoad];


- (void)didReceiveMemoryWarning

    [super didReceiveMemoryWarning];


#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    return 1;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    [lectureName count];


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    return cell;


@end

addLectureViewController.h

#import <UIKit/UIKit.h>

@interface addLectureViewController : UIViewController 
@property (weak, nonatomic) IBOutlet UITextField *lectureNameTextField;
- (IBAction)addButtonPressed:(id)sender;

@property NSMutableArray *lectureName; 
@property NSObject *lecture;

@end

addLectureViewController.m

#import "addLectureViewController.h"

@interface addLectureViewController ()

@end

@implementation addLectureViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
        // Custom initialization
    
    return self;


- (void)viewDidLoad

    [super viewDidLoad];

    _lectureName = [[NSMutableArray alloc] init];
    _lecture = [[NSObject alloc] init];


- (void)didReceiveMemoryWarning

    [super didReceiveMemoryWarning];



- (IBAction)addButtonPressed:(id)sender 

    _lecture = _lectureNameTextField.text;
    [_lectureName addObject:_lecture];
    NSLog(@"%@",_lectureName);



@end

到目前为止一切正常。但是当我尝试在 mainTableViewController.m 使用 _lectureName NSMutableArray 时,我看不到数组。

我知道在 tableView 中打印数组的代码。我知道他们现在不在那儿。我只是不明白在我的代码中实现委托代码。

【问题讨论】:

anaTableViewController 代码似乎没有在任何地方使用,为什么还要包含它? 但是代表在哪里? 你的意思是要把_lectureName的数据传给mainTableViewController?? 我打错了 anaTableViewController 的东西。我现在修好了。我想输入 mainTableViewController。是的,我的意思是将 _lectureName 的数据传输到 mainTableViewController 是的。谢谢。 您可以添加您应用的屏幕截图吗?或者您能否指定您是否在 mainTableViewControlleraddLectureViewController 之间使用了任何 segue 【参考方案1】:

如果你想在表格的行上显示一些东西,你可以取一个 NSArray 并且你必须在委托方法中返回数组的计数:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

 return array.count;

否则,表格将不会显示任何元素。只有当您在 numberOfRowsInSection 方法中返回特定的数组计数时,才会调用委托方法 cellForRowAtIndexPath。

您可以参考这些链接来了解代表: http://www.tutorialspoint.com/ios/ios_delegates.htm

How do I set up a simple delegate to communicate between two view controllers?

http://code.tutsplus.com/tutorials/ios-sdk-custom-delegates--mobile-10848

但在 tableView 的情况下,委托方法是内部定义和内部触发的。我们只需要将这些委托设置为充当侦听器的控制器。

【讨论】:

谢谢,但我知道我只是忘了把它写下来。这是我现在编辑的。我只想了解委托代码。我应该编写哪些代码来将我的数组委托给其他页面?如果你能帮助我,我会很高兴。谢谢。 我编辑了我的答案。看它。 UITableView 委托方法是预定义的,并在您设置 tableview.delegate = self 后立即调用。这基本上是一种回调机制。【参考方案2】:

以下代码可能存在语法错误,但它们可以提供此代码的委托摘要。

进行以下更改:-

mainTableViewController.h

#import <UIKit/UIKit.h>

@interface mainTableViewController : UITableViewController
@property(strong, nonatomic) NSMutableArray *lectureName
@end

在mainTableViewController.m中综合属性lectureName

然后在addLectureViewController.h中做如下修改

#import <UIKit/UIKit.h>
#import "mainTableViewController.h"

@interface addLectureViewController : UIViewController 
@property (weak, nonatomic) IBOutlet UITextField *lectureNameTextField;
- (IBAction)addButtonPressed:(id)sender;
@property(weak, nonatomic) id<mainTableViewController> delegate;
@property NSMutableArray *lectureName; 
@property NSObject *lecture;

@end

在 addLectureViewController.m 中合成属性委托

然后进行以下更改:-

- (IBAction)addButtonPressed:(id)sender 

    _lecture = _lectureNameTextField.text;
    [_lectureName addObject:_lecture];
    NSLog(@"%@",_lectureName);
    delegate.lectureName=_lectureName;

假设您正在从 mainTableViewController 推送 addLectureViewController,请在 mainTableViewController 的 prepareForSegue 中包含以下代码(或您推送 addLectureViewController 的任何方法)。 :-

addLectureViewController *vc=[[addLectureViewController alloc] init];
vc.delegate=self;
// Push vc

上面的代码实际上创建了一个id&lt;mainTableViewController&gt; 类型的弱属性,称为委托(弱是为了防止引用循环)。这样,addLectureViewController 就可以更新 mainTableViewController 的属性了。

【讨论】:

【参考方案3】:

积分:

    为什么mainTableViewController.m 中的类命名为anaTableViewController。它应该是mainTableViewController(几乎总是,直到你变得更高级)。

    mainTableViewControlleraddLectureViewController 应以大写字母开头。

    mainTableViewController 访问lecture 的唯一方法是通过addLectureViewController 对象,例如

    addLectureViewController *alvc = // *something* here
    NSArray *localLecture = [alvc lecture];
    

    弄清楚您如何访问addLectureViewController,您将解决您的问题。

【讨论】:

以上是关于Objective-C 中的委托的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C 中的“中继”委托协议是不好的做法吗?

对Objective-C中的委托有点困惑

Objective-C中的委托(代理)模式

委托和对象保留objective-c (iOS)

Objective-C – 从应用程序委托向视图控制器发送消息

Objective-C 委托内存存储空问题