我很难理解委托(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/