我在标签栏控制器中使用了两个视图控制器: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
答案 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];
}