Я боролся с этим в течение нескольких дней и получил ценную помощь на пути от S.O. Я сделал простейший возможный проект, чтобы уменьшить возможности его опечатки. Весь мой проект - это ViewController, который содержит контейнерный вид, подключенный к childViewController. «Родительский» ViewController устанавливается как делегат childViewController. В viewDidLoad для ребенка я передаю значение, которое является просто строкой. Эта строка должна быть передана родительскому устройству и напечатана на консоли. Вот файлы.делегирование и передача данных назад от childViewController
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
[контроллер loadViewIfNeeded]; сбой приложения. То, что я не совсем понимаю, - это то, как «theValue» получает что-либо. Если это метод, подобный другим, не должен ли я называть его в viewDidLoad следующим образом: [self passValue:] вещь в том, что я не хочу передавать аргумент там, я хочу theValue. Вопрос имеет смысл? – Paul