代表们如何在目标c中工作?

时间:2013-04-24 05:26:15

标签: ios objective-c xcode delegates

我正在试图找出代表,因为我真正需要他们参与我正在进行的项目,但对于我的生活,我无法弄明白。无论我调整代码多少,都没有效果

ViewController.h:

#import <UIKit/UIKit.h>

@class ViewController;

@protocol testDelegate
-(void)sayHi;
@end

@interface ViewController : UIViewController 

- (IBAction)button:(id)sender;
@property (weak, nonatomic)id <testDelegate> delegate;

@end

ViewController.m:

#import "ViewController.h"
#import "DelegateController.h"


@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
DelegateController *dc = [[DelegateController alloc] init];
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

- (IBAction)button:(id)sender {
[self.delegate sayHi];
}
@end

DelegateController.h:

#import "ViewController.h"

@interface DelegateController : UIViewController <testDelegate>

@end

DelegateController.m:

#import "DelegateController.h"

@interface DelegateController ()

@end

@implementation DelegateController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        NSLog(@"init");
        ViewController *vc = [[ViewController alloc] init];
        [vc setDelegate:self];
}
    return self;
}
-(void)viewDidLoad
{
    [super viewDidLoad];
}

-(void)sayHi
{
    NSLog(@"hi");
}


@end

- (IBAction)按钮:(id)发送方法连接到一个按钮,但点击时我没有输出。我做错了什么?

4 个答案:

答案 0 :(得分:1)

ViewController.h:

#import <UIKit/UIKit.h>

@protocol testDelegate
    -(void)sayHi;
@end

@interface ViewController : UIViewController 

@end

ViewController.m:

#import "ViewController.h"
#import "DelegateController.h"

@interface ViewController () <testDelegate>

@end

@implementation ViewController

- (IBAction)pushNewViewController:(id)sender
{
    DelegateController *dc = [[DelegateController alloc] init];
    dc.delegate = self;
    [self.navigationController pushViewController:dc animated:YES];
}

- (void)sayHi
{
    NSLog(@"It works!");
}
@end

DelegateController.h:

#import "ViewController.h"

@interface DelegateController : UIViewController

@property (weak, nonatomic) id<testDelegate> delegate;

@end

DelegateController.m:

#import "DelegateController.h"

@implementation DelegateController

- (IBAction)button:(id)sender
{
    if([_delegate respondsToSelector:@selector(sayHi)]) {
        [_delegate performSelector:@selector(sayHi)];
    }
}

@end

答案 1 :(得分:0)

你的问题是ViewController创建了DelegateController,然后在DelegateController中你创建了一个新的,不同的ViewController实例,并将自己设置为该实例的委托。通常,您设置委托的方式是DelegateController将创建ViewController的实例并将其自身设置为委托。这假设先创建了DelegateController,但具体如何执行此操作取决于您的应用程序结构,以及您如何从控制器移动到控制器。

答案 2 :(得分:0)

替换按钮单击方法

- (IBAction)button:(id)sender {
    // Check whether your Delegate method is implemeted or not
    if([delegate respondsToSelector:@selector(sayHi)])
    {
        // Call Delegate Method
        [delegate performSelector:@selector(sayHi)];
    }
}

答案 3 :(得分:0)

试试这个:

ViewController.h

#import <UIKit/UIKit.h>

@class ViewController;

@protocol testDelegate
-(void)sayHi;
@end

@interface ViewController : UIViewController 

- (IBAction)button:(id)sender;
@property (weak, nonatomic)id <testDelegate> delegate;

@end

ViewController.m

#import "ViewController.h"
#import "DelegateController.h"


@interface ViewController ()
@property (nonatomic, strong) DelegateController *dc;
@end

@implementation ViewController

- (void)viewDidLoad
{
   [super viewDidLoad];
   // Do any additional setup after loading the view, typically from a nib.
  _dc = [[DelegateController alloc] init];
  [self setDelegate:_dc];
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

- (IBAction)button:(id)sender
{
   [self.delegate sayHi];
}
@end

DelegateController.h

@interface DelegateController : UIViewController <testDelegate>

@end

DelegateController.m

#import "DelegateController.h"

@interface DelegateController ()

@end

@implementation DelegateController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self)
    {
        NSLog(@"init");
    }
    return self;
}
-(void)viewDidLoad
{
    [super viewDidLoad];
}

-(void)sayHi
{
    NSLog(@"hi");
}

@end