在ViewDidLoad之前将数据传递到选项卡栏视图控制器中的方法

时间:2019-01-22 03:20:25

标签: ios objective-c uitabbarcontroller

我在标签栏控制器中使用了两个视图控制器:FirstViewController和SecondViewController。我试图从FirstViewController调用SecondViewController中的方法,但是在通过选择Second Tab加载SecondViewController之前执行此操作。这可能吗?我已经尝试过通知和委托,但是似乎无法正常工作,除非我选择SecondViewController并先运行ViewDidLoad,然后从FirstViewController调用它。

这是在Objective-c中,我正在尝试在SecondViewController中调用setAutoModeTimer()。

这是我的代码:

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 :(得分:0)

您不需要在每个视图控制器中保留另一个引用。您正在做的是在每个视图控制器中创建UIViewControllers的新实例。

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

viewDidLoad完成后,将首先释放VC实例。 因为您创建了本地var。它与您在tabBar中拥有的viewController不同。

您需要一次设置视图控制器之间的连接。

这可以通过以编程方式而不是在stroryboard中设置UITabBarController来完成。 您可以一次设置UITabBarController的viewController,并在它们之间建立连接。

#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];

}