需要iOS中代表的帮助吗

需要iOS中代表的帮助吗,ios,delegates,Ios,Delegates,我很难理解代表们的想法。我试着用一个简单的例子来教自己,但就是不起作用 我的简单测试有两个类。A类和B类。ClassA具有委托定义。以及调用方法的按钮(-(void)buttonHasBeenPressed:(id)sender),该方法包含委托方法调用(-(void)buttonPressed)。ClassB被设置(我认为)监听ClassA委托,当按下-(void)按钮时:(id)sender被调用,它将写入控制台 以下是AppDelegate: .h: #import <UIKit/U

我很难理解代表们的想法。我试着用一个简单的例子来教自己,但就是不起作用

我的简单测试有两个类。A类和B类。ClassA具有委托定义。以及调用方法的按钮(
-(void)buttonHasBeenPressed:(id)sender
),该方法包含委托方法调用(
-(void)buttonPressed
)。ClassB被设置(我认为)监听ClassA委托,当按下
-(void)按钮时:(id)sender
被调用,它将写入控制台

以下是AppDelegate:

.h:

#import <UIKit/UIKit.h>

@interface DelegateTestAppDelegate : NSObject <UIApplicationDelegate> {

}

@property (nonatomic, retain) IBOutlet UIWindow *window;

@end
#import "DelegateTestAppDelegate.h"
#import "ClassA.h"

@implementation DelegateTestAppDelegate


@synthesize window=_window;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ClassA *classA = [[ClassA alloc] init];
    [self.window addSubview:[classA view]];

    // Override point for customization after application launch.
    [self.window makeKeyAndVisible];
    return YES;
}


- (void)dealloc
{
    [_window release];
    [super dealloc];
}

@end
#import <UIKit/UIKit.h>

@protocol ClassADelegate <NSObject>;
-(void)buttonPressed;
@end

@interface ClassA : UIViewController {

    id <ClassADelegate> delegate;
}

@property (retain) id <ClassADelegate> delegate;

-(void)buttonHasBeenPressed:(id)sender;

@end
#import "ClassA.h"

@implementation ClassA

@synthesize delegate;

-(id)init {

    return self;
}

- (id)initWithNibName:(NSString *)nibNameOrNil
               bundle:(NSBundle *)nibBundleOrNil {
    return [self init];
}

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button addTarget:self action:@selector(buttonHasBeenPressed:) forControlEvents:UIControlEventTouchDown];
    [button setTitle:@"hola" forState:UIControlStateNormal];
    button.frame =CGRectMake(50, 200, 100, 20);
    [self.view addSubview:button];
}


-(void)buttonHasBeenPressed:(id)sender {
    [self.delegate buttonPressed];
    NSLog(@"button has been pressed");
}


@end
#import <UIKit/UIKit.h>
#import "ClassA.h"


@interface ClassB : UIViewController <ClassADelegate> {

}

@end
#import "ClassB.h"

@implementation ClassB

-(id)init {


    return self;
}

- (id)initWithNibName:(NSString *)nibNameOrNil
               bundle:(NSBundle *)nibBundleOrNil {
    return [self init];
}


-(void)buttonPressed {
    NSLog(@"delegating!");
}

@end
这是ClassA:

.h:

#import <UIKit/UIKit.h>

@interface DelegateTestAppDelegate : NSObject <UIApplicationDelegate> {

}

@property (nonatomic, retain) IBOutlet UIWindow *window;

@end
#import "DelegateTestAppDelegate.h"
#import "ClassA.h"

@implementation DelegateTestAppDelegate


@synthesize window=_window;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ClassA *classA = [[ClassA alloc] init];
    [self.window addSubview:[classA view]];

    // Override point for customization after application launch.
    [self.window makeKeyAndVisible];
    return YES;
}


- (void)dealloc
{
    [_window release];
    [super dealloc];
}

@end
#import <UIKit/UIKit.h>

@protocol ClassADelegate <NSObject>;
-(void)buttonPressed;
@end

@interface ClassA : UIViewController {

    id <ClassADelegate> delegate;
}

@property (retain) id <ClassADelegate> delegate;

-(void)buttonHasBeenPressed:(id)sender;

@end
#import "ClassA.h"

@implementation ClassA

@synthesize delegate;

-(id)init {

    return self;
}

- (id)initWithNibName:(NSString *)nibNameOrNil
               bundle:(NSBundle *)nibBundleOrNil {
    return [self init];
}

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button addTarget:self action:@selector(buttonHasBeenPressed:) forControlEvents:UIControlEventTouchDown];
    [button setTitle:@"hola" forState:UIControlStateNormal];
    button.frame =CGRectMake(50, 200, 100, 20);
    [self.view addSubview:button];
}


-(void)buttonHasBeenPressed:(id)sender {
    [self.delegate buttonPressed];
    NSLog(@"button has been pressed");
}


@end
#import <UIKit/UIKit.h>
#import "ClassA.h"


@interface ClassB : UIViewController <ClassADelegate> {

}

@end
#import "ClassB.h"

@implementation ClassB

-(id)init {


    return self;
}

- (id)initWithNibName:(NSString *)nibNameOrNil
               bundle:(NSBundle *)nibBundleOrNil {
    return [self init];
}


-(void)buttonPressed {
    NSLog(@"delegating!");
}

@end
这是B类:

.h:

#import <UIKit/UIKit.h>

@interface DelegateTestAppDelegate : NSObject <UIApplicationDelegate> {

}

@property (nonatomic, retain) IBOutlet UIWindow *window;

@end
#import "DelegateTestAppDelegate.h"
#import "ClassA.h"

@implementation DelegateTestAppDelegate


@synthesize window=_window;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ClassA *classA = [[ClassA alloc] init];
    [self.window addSubview:[classA view]];

    // Override point for customization after application launch.
    [self.window makeKeyAndVisible];
    return YES;
}


- (void)dealloc
{
    [_window release];
    [super dealloc];
}

@end
#import <UIKit/UIKit.h>

@protocol ClassADelegate <NSObject>;
-(void)buttonPressed;
@end

@interface ClassA : UIViewController {

    id <ClassADelegate> delegate;
}

@property (retain) id <ClassADelegate> delegate;

-(void)buttonHasBeenPressed:(id)sender;

@end
#import "ClassA.h"

@implementation ClassA

@synthesize delegate;

-(id)init {

    return self;
}

- (id)initWithNibName:(NSString *)nibNameOrNil
               bundle:(NSBundle *)nibBundleOrNil {
    return [self init];
}

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button addTarget:self action:@selector(buttonHasBeenPressed:) forControlEvents:UIControlEventTouchDown];
    [button setTitle:@"hola" forState:UIControlStateNormal];
    button.frame =CGRectMake(50, 200, 100, 20);
    [self.view addSubview:button];
}


-(void)buttonHasBeenPressed:(id)sender {
    [self.delegate buttonPressed];
    NSLog(@"button has been pressed");
}


@end
#import <UIKit/UIKit.h>
#import "ClassA.h"


@interface ClassB : UIViewController <ClassADelegate> {

}

@end
#import "ClassB.h"

@implementation ClassB

-(id)init {


    return self;
}

- (id)initWithNibName:(NSString *)nibNameOrNil
               bundle:(NSBundle *)nibBundleOrNil {
    return [self init];
}


-(void)buttonPressed {
    NSLog(@"delegating!");
}

@end
当点击“hola”按钮时,预期的结果是将“按钮已按下”和“授权!”写入控制台

谢谢你的帮助。。。
Shawn

您的ClassB实例在哪里?我在你发布的代码中找不到它。 另外,您在哪里将实例作为其委托设置到ClassA中?我也找不到


如果您不做这两件事,您的委托将永远不会被调用。

您忘记将委托设置为符合ClassADelegate协议的类,这里它应该是ClassB的对象。

好。。。我想我理解你的第一个问题。如果我只是从AppDelegate中的ClassB创建对象(只是懒惰),那么第一个问题就解决了。至于你的第二个问题,我不太明白。谢谢你的耐心。现在感觉非常密集…可能需要一些睡眠。您应该像下面这样将ClassB的实例设置为ClassA
ClassA.delegate=ClassB否则,classA.delegate始终为零,并且将无法发送任何方法。对吧?:)