【问题标题】:Need Help With Delegates in iOS在 iOS 中需要代理的帮助
【发布时间】:2011-08-24 13:16:10
【问题描述】:

我很难理解代表们。我试着整理一个简单的例子来自学,但它不起作用。

我的简单测试有两个类。 A 类和 B 类。 ClassA 具有委托定义。以及调用包含委托方法调用 (-(void)buttonPressed) 的方法 (-(void)buttonHasBeenPressed:(id)sender) 的按钮。 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

这里是 A 类:

.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”按钮时写入控制台。

感谢您的帮助... 肖恩

【问题讨论】:

    标签: ios delegates


    【解决方案1】:

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

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

    【讨论】:

    • 好的...我想我理解你的第一个问题。如果我只是在 AppDelegate 中从 ClassB 创建对象(只是懒惰),那将解决您的第一个问题。至于你的第二个问题,我不太明白。谢谢你的耐心。现在感觉很密集……可能需要睡一会儿。
    • 您应该像这样classA.delegate = classB; 将 ClassB 的实例设置为 ClassA,否则您的 classA.delegate 始终为零,并且无法发送任何方法。正确的? :)
    【解决方案2】:

    您忘记将 delegate 设置为符合 ClassADelegate 协议的类,这里应该是 ClassB

    的对象

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-29
      • 2010-11-04
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多