私はプログラミングの初心者であり (プログラミングの教育を受けていません。知っていることはすべてチュートリアルを読んで得たものです)、XCode と iOS の開発はまったくの初心者です。これまでのところ、iOS アプリの開発の基本は理解していますが、デリゲートがどのように機能するのか理解できないことが 1 つあります。デリゲートを使用する背後にある考え方は理解していますが、デリゲートを実装しようとするときに何が間違っているのかわかりません。カスタム デリゲートの実装方法を説明するために、小さな例 (シングル ビュー アプリケーション) を作成しました。何が間違っているのか教えていただければ幸いです。
XCode 4.5.2、ARC を有効にした 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
上記の例の問題は、ビューのラベルに「AfterDelegate」と書きたい場所に「Before delegate」としか書かれていないことです。
すべての助けに感謝します。あけましておめでとう。