自定义代理遇到问题

时间:2013-01-01 15:04:48

标签: objective-c delegates

我在编程方面相当新(我没有编程方面的教育 - 我所知道的一切都是通过阅读教程获得的),而且在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

以上示例的问题是视图上的标签仅写入&#34;在委托之前&#34;我希望它写在哪里&#34; AfterDelegate&#34;。

非常感谢所有帮助。新年快乐。

1 个答案:

答案 0 :(得分:4)

您尚未将代理设置在任何位置,因此它将为nil。您需要initWithString:delegate:而不是initWithString:或(更好)只需创建对象,设置委托,然后单独发送字符串。

您可能犯了一个(常见的)错误,假设@synthesize实际上在您的代码中创建了一个对象并为其赋值。它不是。它是编译器为属性创建访问器方法的(现在大多数是冗余!)指令。

下面是您的委托类的一个稍微重做的示例,以及一些示例用法:

.h文件:

@interface TestClassWithDelegate : NSObject

@property (weak, nonatomic) id<TestDelegate> delegate;
-(void)processString:(NSString*)string

@end

.m文件:

@implementation TestClassWithDelegate

-(void)processString:(NSString *)theString
{
   [delegate stringToWrite:theString];
}

@end

用法:

TestClassWithDelegate *test = [TestClassWithDelegate new];
[test processString:@"Hello!"]; // Nothing will happen, there is no delegate
test.delegate = self;
[test processString:@"Hello!"]; // Delegate method will be called.