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 是的。谢谢。
您可以添加您应用的屏幕截图吗?或者您能否指定您是否在 mainTableViewController 和 addLectureViewController 之间使用了任何 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<mainTableViewController>
类型的弱属性,称为委托(弱是为了防止引用循环)。这样,addLectureViewController 就可以更新 mainTableViewController 的属性了。
【讨论】:
【参考方案3】:积分:
为什么mainTableViewController.m
中的类命名为anaTableViewController
。它应该是mainTableViewController
(几乎总是,直到你变得更高级)。
mainTableViewController
和 addLectureViewController
应以大写字母开头。
mainTableViewController
访问lecture
的唯一方法是通过addLectureViewController
对象,例如
addLectureViewController *alvc = // *something* here
NSArray *localLecture = [alvc lecture];
弄清楚您如何访问addLectureViewController
,您将解决您的问题。
【讨论】:
以上是关于Objective-C 中的委托的主要内容,如果未能解决你的问题,请参考以下文章
Objective-C 中的“中继”委托协议是不好的做法吗?