iOS Objective-C блок обратного вызова проблема

Я пытаюсь использовать чистый код для создания UI practice block pass value между viewController. Но блок обратного вызова не работал. Метод NSLog ничего не печатал в области отладки. Вот код. Дайте мне несколько советов, Спасибо.

ВИРТУАЛЬНЫЙ КАНАЛ.ч

#import <UIKit/UIKit.h>

@interface SecondViewController : UIViewController
    @property (copy, nonatomic) void (^callBack)(NSString *text);
@end

ВИРТУАЛЬНЫЙ КАНАЛ.м

- (UITextField *)textField {
    if (!_textField) {
        _textField = [[UITextField alloc] init];
        _textField.backgroundColor = [UIColor whiteColor];
    }
    return _textField;
}

- (UIButton *)button {
    if (!_button) {
        _button = [[UIButton alloc] init];
        _button.backgroundColor = [UIColor blueColor];
        [_button addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
    }
    return _button;
}

- (void)setupUI {
    [self.view addSubview:self.textField];
    [self.view addSubview:self.button];

    [self.textField mas_makeConstraints:^(MASConstraintMaker *make) {
        make.width.mas_equalTo(200);
        make.height.mas_equalTo(50);
        make.centerX.mas_equalTo(self.view.mas_centerX);
        make.centerY.mas_equalTo(self.view);
    }];

    [self.button mas_makeConstraints:^(MASConstraintMaker *make) {
        make.width.mas_equalTo(200);
        make.height.mas_equalTo(50);
        make.centerX.mas_equalTo(self.view);
        make.centerY.mas_equalTo(self.view).offset(100);
    }];
}

- (void)buttonAction {

    NSString *str = self.textField.text;
    if (self.callBack != nil) {
        self.callBack(str);
        NSLog(@"This statement didnt print in log");
    }
}

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setupUI];
    // Do any additional setup after loading the view.

    self.view.backgroundColor = [UIColor redColor];
}

код обновления

VC2.м

- (void)viewWillAppear:(BOOL)animated{

            self.callBack = ^(NSString *text){

            };
    }
- (void)buttonAction {

    if (self.callBack) {
        NSLog(@"It worked on debug area %@", self.textField.text);
        self.callBack(self.textField.text);
    }
    self.textField.text = @"";
}

VC1.м

- (void)viewDidLoad {
    [super viewDidLoad];
    _secondVc = [[SecondViewController alloc] init];
    _secondVc.callBack = ^(NSString *str){

    };
    [self setupUI];

    self.view.backgroundColor = [UIColor greenColor];
}

- (void)viewWillAppear:(BOOL)animated {

    if (_secondVc.callBack != nil) {
        NSLog(@"It wrked on debug screen");
        _secondVc.callBack = ^(NSString *str){
            NSLog(@"It didn't worked on debug screen");
            //I want set my label.text = str;
        };
};

}

2 ответа

  1. Единственный способ, что вы свойство

    @property (copy, nonatomic) void (^callBack)(NSString *text);
    

    быть пустой. Попробуйте поместить точку останова в buttonActionметод и посмотреть на свойство.

  2. Как Сандер и Кришнака упоминали ваш callBackравен нулю. Я бы предложил вам создать определение блока, как это:

    typedef void(^TextBlock)(NSString *text);
    

    Затем измените свойство на:

    @property (copy, nonatomic) TextBlock callBack;
    

    Создайте копию блока в контроллере первого вида:

    @interface FirstViewController()
    
    @property (copy, nonatomic) TextBlock firstViewControllerCallBack;
    
    @end
    

    Инициализировать копию обратного вызова (т. е. в viewDidLoad)

    - (void)viewDidLoad {
        [super viewDidLoad];
        self.firstViewControllerCallBack = ^(NSString *text){
            NSLog(@"Second view controller's button tapped!");
        };
    }
    

    Назначьте обратный вызов второму контроллеру вида прямо перед его представлением / нажатием:

    SecondViewController *secondVC = [[SecondViewController alloc] init];
    secondVC.callBack = self.firstViewControllerCallBack; // Assign the callback
    // ... Presenting the view controller
    

    Очистите блок завершения после того, как вы сделали с ним (т. е. в viewWillDisappear):

    - (void)viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
        self.firstViewControllerCallBack = nil;
    }