为什么我的委托课不起作用?

时间:2014-05-12 18:48:36

标签: ios objective-c appdelegate

我有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

第二个类用

创建一个新的viewController
UIBarButtonItem *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;  

3 个答案:

答案 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;