[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
ContaonerViewController.h
#import <UIKit/UIKit.h>
@protocol ChildContainerDelegate; // << 前置宣言
@interface ContainerViewController : UIViewController
@property (nonatomic,assign) id<ChildContainerDelegate> delegate; // delegateの宣言
@property (weak, nonatomic) IBOutlet UILabel *MyLabel;
-(void)myfunc;
@end
// delgateの定義
@protocol ChildContainerDelegate <NSObject>
// Delegate用関数の定義(必ず実装しないといけない)
-(void) sampleA:(NSString *)message;
@optional
// Delegate用関数の定義(Optionalの配下では、必ずしも実装しなくてもよい)
-(void) sampleB:(NSString *)message;
@end
1.Delegateに名前をつける。"ChildConatinerDelegate"
2.子のクラスで、Delegateを使用することを宣言する。
プロトコルの宣言とプロパティの宣言
@protocol ChildContainerDelegate;
@proparty (nonatomic, assign) id<ChildContainerDelegate> delegate;
*propartyは、@interface~@endに記載する。
3.delegateの定義
delegateで使用する関数を定義する。
@protcol ChildCOnatinerDelegate <NSObject>
@end
(引数なし)
-(void) sampleC;
ContaonerViewController.m
#import "ContainerViewController.h"
@interface ContainerViewController ()
@end
@implementation ContainerViewController
@synthesize delegate=_delegate;
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
-(void)myfunc{
_MyLabel.text = @"FUNC";
}
- (IBAction)MyButton2:(id)sender {
NSLog(@"BUTTON2");
//親クラスにイベントを発火させる(関数A)
//respondsToSelectorで実装されているかどうかを調べてから発火する。
if( [_delegate respondsToSelector:@selector(sampleA:)]){
[_delegate sampleA:@"MESSAGE_DELEGATE_FUNCTION"];
}
//親クラスに実装されていないイベントを発火させる(関数A)
if( [_delegate respondsToSelector:@selector(sampleB:)]){
[_delegate sampleB:@"MESSAGE_DELEGATE_FUNCTION"];
}
}
@end
1.delegateの名前を宣言する
@synthesize delegate=_delegate;
//実は、XCode4以降必要ない。(_delegate以外の名前を使用したい場合は記述する)
2.親クラスにイベントを発火させる。
_delegate sampleA:["MESSAGE_DELEGATE_FUNCTION"];
事前に実装されているか調べて実行したほうがいい。
[_delegate respondsToSelector:@sekector(SampleA:)]で調べられる。
ViewController.h
#import <UIKit/UIKit.h>
#import "ContainerViewController.h"
@interface ViewController : UIViewController <ChildContainerDelegate>
@property (weak, nonatomic) IBOutlet UILabel *lbl;
@end
1.クラスにdelegateを使用することを宣言する
@inteface ViewController : UIViewContorller <ChildContainerDelegate>
ViewController.m
#import "ViewController.h"
@interface ViewController ()
@property (strong, nonatomic) NSString *currentSegueIdentifier;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
for (id childview in self.childViewControllers) {
ContainerViewController *cview = childview;
if ([cview.title isEqualToString:@"ChildContainer1"]){
cview.delegate = self;
}
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
// delegateが呼び出された時に、labelの内容を変更する
-(void)sampleA:(NSString *)Message{
NSLog(@"DELEGATE:%@", Message);
_lbl.text = @"DELEGATE";
}
- (IBAction)Button1:(id)sender {
for (id c in self.childViewControllers) {
ContainerViewController *cview = c;
if ([cview.title isEqualToString:@"ChildContainer1"]){
[cview myfunc];
}
}
}
@end
View