Нужна помощь с делегатами в iOS - PullRequest
0 голосов
/ 24 августа 2011

Мне тяжело собираться с делегатами. Я пытался собрать простой пример, чтобы научить себя, но он просто не работает.

Мой простой тест состоит из двух классов. ClassA и ClassB. ClassA имеет определение делегата. Также как кнопка, которая вызывает метод (-(void)buttonHasBeenPressed:(id)sender), который содержит вызов метода делегата (-(void)buttonPressed). ClassB настроен (я думаю) для прослушивания делегата ClassA, и когда вызывается -(void)buttonHasBeenPressed:(id)sender, он записывает в консоль.

Вот AppDelegate:

.h:

#import <UIKit/UIKit.h>

@interface DelegateTestAppDelegate : NSObject <UIApplicationDelegate> {

}

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

@end

.m:

#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

Вот класс А:

.h:

#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

.m:

#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

Вот класс B:

.h:

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


@interface ClassB : UIViewController <ClassADelegate> {

}

@end

.m:

#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».

Спасибо за вашу помощь ... Шон

Ответы [ 2 ]

1 голос
/ 24 августа 2011

вы забыли установить делегат для класса, который соответствует ClassADelegate протокол, здесь, который должен быть объектом ClassB

1 голос
/ 24 августа 2011

Где находится экземпляр вашего ClassB?Я не могу найти его в вашем опубликованном коде.Кроме того, где вы устанавливаете экземпляр в ClassA в качестве его делегата?Я тоже не могу его найти.

Если вы не делаете эти две вещи, ваш делегат никогда не будет вызван.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...