ios - 在 iOS 中需要有关委托(delegate)的帮助

标签 ios delegates

我很难理解委托(delegate)。我尝试整理一个简单的示例来自学,但它就是行不通。

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

预期的结果是“按钮已被按下”和“委托(delegate)!”单击“hola”按钮时写入控制台。

感谢您的帮助... 肖恩

最佳答案

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

如果您不执行这两件事,您的委托(delegate)将永远不会被调用。

关于ios - 在 iOS 中需要有关委托(delegate)的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7170690/

相关文章:

ios - 如何在文件swift中写入字节数据

ios - 导航后导航栏损坏

ruby - 从 Cocoa 开发者背景解释 ruby​​ 中的委托(delegate)

c# - 实例方法如何转换为委托(delegate)?

c# - 在 C# .Net 中使用委托(delegate),当我用完 .Net 线程池中的线程时会发生什么情况?

objective-c - 属性(property)不保留 (ARC)

ios - iOS App Bundle 中的多个本地化 .strings 文件

android - Flutter: `Container` 高度无法在 `Stack` 内部调整

ios - 将核心数据对象设置为零

events - 除了 UI 之外,您还以何种方式使用委托(delegate)和/或事件?