Передача данных в метод в панели вкладок View Controller перед ViewDidLoad - PullRequest
0 голосов
/ 22 января 2019

У меня есть два контроллера представления, используемых в контроллере панели вкладок: FirstViewController и SecondViewController. Я пытаюсь вызвать метод в SecondViewController из FirstViewController, но сделать это до загрузки SecondViewController, выбрав вторую вкладку. Это возможно? Я пробовал уведомления и делегаты и, похоже, не могу заставить его работать, если я не выберу SecondViewController и сначала не запусту ViewDidLoad, а затем вызову его из FirstViewController.

Это в target-c, и я пытаюсь вызвать setAutoModeTimer () в SecondViewController.

Вот мой код:

FirstViewController.h

#import <UIKit/UIKit.h>

@protocol FirstViewControllerDelegate <NSObject>

- (void) setAutoModeTimer;

@end

@interface FirstViewController : UIViewController

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

@end

FirstViewController.m

#import "FirstViewController.h"
#import "SecondViewController.h"

@interface FirstViewController ()

@end

@implementation FirstViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    SecondViewController * myViewController = [[SecondViewController alloc] init];
    [myViewController view];
    // Do any additional setup after loading the view, typically from a nib.
}

//- (void)loadView{[self.tabBarController.viewControllers makeObjectsPerformSelector:@selector(view)];}


- (IBAction)startTimerButtonPressed:(id)sender {

    [self.delegate setAutoModeTimer];

}
@end

SecondViewController.h

#import <UIKit/UIKit.h>

@interface SecondViewController : UIViewController

@end

SecondViewController.m

#import "SecondViewController.h"
#import "FirstViewController.h"

@interface SecondViewController () <FirstViewControllerDelegate>

@end

@implementation SecondViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    FirstViewController *firstVC = [self.storyboard instantiateViewControllerWithIdentifier:@"FirstViewController"];
    firstVC.delegate = self;

}

- (void) setAutoModeTimer
{
    NSLog(@"Timer has started");
}

@end

1 Ответ

0 голосов
/ 22 января 2019

Вам не нужно хранить ссылки в каждом контроллере представления для другого. Что вы делаете, это создаете новые экземпляры UIViewControllers в каждом контроллере представления.

   FirstViewController *firstVC = [self.storyboard instantiateViewControllerWithIdentifier:@"FirstViewController"];
   firstVC.delegate = self;

После завершения viewDidLoad будет выпущен первый экземпляр VC. Потому что вы создали локальный вар. Это не тот же viewController, который вы используете в tabBar.

Вам необходимо настроить соединение между контроллерами вида один раз.

Это можно сделать, установив UITabBarController программно, а не в stroryboard. Вы можете настроить viewControllers для UITabBarController один раз и установить соединения между ними.

#import "SecondViewController.h"
#import "FirstViewController.h"

@implementation MainTabBarController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSMutableArray *listOfViewControllers = [[NSMutableArray alloc] init];
    FirstViewController *firstVC = [self.storyboard instantiateViewControllerWithIdentifier:@"FirstViewController"];
    SecondViewController * secondVC = [[SecondViewController alloc] init];
    firstVC.delegate = secondVC;
    [listOfViewControllers addObject:firstVC];
    [listOfViewControllers addObject:secondVC];

    [self setViewControllers:listOfViewControllers
                                 animated:YES];

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...