-1

私はこれに数日間苦労しており、途中で貴重な助けを借りて、タイプミスの可能性を減らすために可能な限り単純なプロジェクトを作成しました。私のプロジェクトはすべて、childViewControllerにフックされたコンテナビューを保持するViewControllerです。「親」ViewController は、childViewController のデリゲートとして設定されます。子の viewDidLoad では、単なる文字列である値を渡しています。この文字列は親に渡され、コンソールに出力されます。ここにファイルがあります。

ViewController.h

#import <UIKit/UIKit.h>
#import "ChildViewController.h"

@interface ViewController : UIViewController <ChildViewControllerDelegate>

@end

ViewController.m

#import "ViewController.h"

@interface ViewController ()

@property NSString *myValueRetrieved;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

   ChildViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"ChildVC"];

    controller.delegate = self;

    NSLog(@"Here is my value: %@",self.myValueRetrieved);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void) passValue:(NSString *)theValue{

    self.myValueRetrieved = theValue;
}

@end

ChildViewController.h

#import <UIKit/UIKit.h>

@protocol ChildViewControllerDelegate;

@interface ChildViewController : UIViewController

@property (weak)id <ChildViewControllerDelegate> delegate;

@end

@protocol ChildViewControllerDelegate <NSObject>

- (void) passValue:(NSString*) theValue;

@end

ChildViewController.m

#import "ChildViewController.h"

@interface ChildViewController ()
@property NSArray *colors;
@end

@implementation ChildViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self.delegate passValue:@"Hello"];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

@end

アプリが起動されると、コンソールは次のメッセージをログに記録する必要があると考えるのは正しいですか: 「ここに私の値があります: こんにちは」. 論理的に委任を受けられないという点で何か間違っていますか、それともどこかで愚かなタイプミスですか? TX

4

2 に答える 2

0

これを行うには、ParentController を ChildController のデリゲートにします。これにより、ChildController はメッセージを ParentController に送り返し、データを送り返すことができます。

ParentController が ChildController のデリゲートになるには、指定する必要がある ChildController のプロトコルに準拠する必要があります。これは、どのメソッドを実装する必要があるかを ParentController に伝えます。

ChildController.h では、#import の下、@interface の上でプロトコルを指定します。

@class ChildController;

@protocol ViewControllerBDelegate <NSObject>
- (void)addItemViewController:(ChildController *)controller didFinishEnteringItem:(NSString *)item;
@end

次に ChildController.h でデリゲート プロパティを設定し、ChildController.h で合成する必要があります。

@property (nonatomic, weak) id <ChildControllerDelegate> delegate;

ChildController では、View Controller をポップするときにデリゲートでメッセージを呼び出します。

NSString *itemToPassBack = @"Pass this value back to ParentController";
[self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack];

ChildController については以上です。次に、ParentController.h で、ParentViewController に Child をインポートしてそのプロトコルに準拠するように指示します。

import "ChildController.h"

@interface ParentController : UIViewController ParentController.m で、プロトコルから次のメソッドを実装します

- (void)addItemViewController:(ChildController *)controller didFinishEnteringItem:(NSString *)item
{
    NSLog(@"This was returned from ChildController %@",item);
}

最後に必要なことは、ChildController を nav スタックにプッシュする前に、ParentController がデリゲートであることを ChildController に伝えることです。

ChildController *ChildController = [[ChildController alloc] initWithNib:@"ChildController" bundle:nil];
ChildController.delegate = self
[[self navigationController] pushViewController:ChildController animated:YES];
于 2016-01-25T05:09:30.653 に答える