我在编程方面相当陌生(我没有编程方面的教育——我所知道的一切都是通过阅读教程获得的)并且在 XCode 和 iOS 开发方面是全新的。到目前为止,我了解开发 iOS 应用程序的基础知识,但我无法弄清楚委托是如何工作的。我理解使用委托背后的想法,但我不知道在尝试实现委托时我做错了什么。我创建了一个小示例(单视图应用程序)来说明我如何实现自定义委托,希望您能告诉我我做错了什么。
我正在使用启用了 ARC 的 XCode 4.5.2、iOS6.0。
在示例中,我创建了一个简单的 NSObject 子类 (TestClassWithDelegate)。TestClassWithDelegate.h 看起来像这样:
@protocol TestDelegate <NSObject>
-(void)stringToWrite:(NSString *)aString;
@end
@interface TestClassWithDelegate : NSObject
@property (weak, nonatomic) id<TestDelegate> delegate;
-(TestClassWithDelegate *)initWithString:(NSString *)theString;
@end
TestClassWithDelegate.m 看起来像这样:
#import "TestClassWithDelegate.h"
@implementation TestClassWithDelegate
@synthesize delegate;
-(TestClassWithDelegate *)initWithString:(NSString *)theString
{
self=[super init];
[delegate stringToWrite:theString];
return self;
}
@end
视图控制器 (ViewController) 由一个 UILabel 组成,我想在其中写入一些文本。ViewController.h 看起来像这样:
#import "TestClassWithDelegate.h"
@interface ViewController : UIViewController <TestDelegate>
@property (weak, nonatomic) IBOutlet UILabel *testlabel;
@end
ViewController.m 看起来像这样:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize testlabel;
- (void)viewDidLoad
{
[super viewDidLoad];
self.testlabel.text = @"Before delegate";
TestClassWithDelegate *dummy = [[TestClassWithDelegate alloc] initWithString:@"AfterDelegate"]; //This should init the TestClassWithDelegate which should "trigger" the stringToWrite method.
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma mark Test delegate
- (void)stringToWrite:(NSString *)aString
{
self.testlabel.text = aString;
}
@end
上面例子的问题是视图上的标签只写了“Before delegate”,我希望它写“AfterDelegate”。
非常感谢所有帮助。新年快乐。