我有3个班级
1°仅包含协议声明
按下保存按钮时,2°调用委托方法
3°实现协议中声明的功能并打印“It's Work!”在日志
这就是我要做的,但它不起作用!!
我试图在secondo类中插入此代码:
NSLog(@"Delegate --> %@", self.delegate);
我在输出中看到这一行:
Delegate --> (null)
我不明白为什么以及我错在哪里!!
1°课程代码:
/************************——— NewContoDelegate.h —————************************/
#import <Foundation/Foundation.h>
#import "Conto.h"
@protocol NewContoDelegate <NSObject>
@optional
-(void)insertNewConto:(Conto *)conto;
@end
第二个类用
创建一个新的viewControllerUIBarButtonItem *doneitem = [[UIBarButtonItem alloc] initWithTitle:@"Salva" style:UIBarButtonItemStyleBordered target:self action:@selector(saveContoPressed)];
按下按钮时,请调用委托方法:
[self.delegate insertNewConto:newConto];
2°班级代码:
/************************———- NewViewController.h —————************************/
#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
#import "NewContoDelegate.h"
#import "Conto.h"
@interface NewViewController : UIViewController <UITextFieldDelegate, NewContoDelegate>{
…
…
__weak id <NewContoDelegate> _delegate;
}
- (void)saveContoPressed;
@property (nonatomic, weak) id <NewContoDelegate> delegate;
@end
/************************———- NewViewController.m —————************************/
#import "NewViewController.h"
#import "Conto.h"
@interface NewViewController ()
@end
@implementation NewViewController
@synthesize delegate = _delegate;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
//self.view.backgroundColor = [UIColor lightGrayColor];
self.view.backgroundColor = [UIColor lightGrayColor];
…
…
…
UIBarButtonItem *doneitem=[[UIBarButtonItem alloc]initWithTitle:@"Salva" style:UIBarButtonItemStyleBordered target:self action:@selector(saveContoPressed)];
self.navigationItem.rightBarButtonItem=doneitem;
}
return self;
}
- (void)saveContoPressed
{
if(condition){
… something …
} else {
Conto *newConto = [[Conto alloc] init];
[self.delegate insertNewConto:newConto];
}
}
最后一个类实现了insertNewConto函数
3°课程代码:
/************************———- ListViewController.h —————************************/
#import <UIKit/UIKit.h>
#import "NewContoDelegate.h"
#import "Conto.h"
@interface ListViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, NewContoDelegate> {
}
@end
/************************———- ListViewController.m —————************************/
#import "ListViewController.h"
@interface ListViewController ()
@end
@implementation ListViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
self.view.backgroundColor = [UIColor clearColor];
…
…
}
return self;
}
-(void)insertNewConto:(Conto *)conto {
NSLog(@“It’s Work! :) ”);
}
在AppDelegate类中设置委托:
newViewController.delegate = listViewController;
答案 0 :(得分:1)
像这样设置委托
self.listViewController = [[ListViewController alloc] initWithNibName:nil bundle:nil];
self.delegate = self.listViewController;
你的init中的。有人必须对委托实例有强烈的引用。
答案 1 :(得分:1)
在我看来,你没有将ListViewController设置为NewContoDelegate的委托。
您接受协议但从未设置委托。
答案 2 :(得分:0)
我了解!!!!!
正如你告诉我的那样,我忘了设置委托,但我没有意识到:我必须在 AppDelegate 类中设置委托!谢谢你的答案!!
我在AppDelegate中插入此行:
newViewController.delegate = listViewController;