我在编程方面相当新(我没有编程方面的教育 - 我所知道的一切都是通过阅读教程获得的),而且在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;。
非常感谢所有帮助。新年快乐。
答案 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.