我有一个iOS(Objective C)应用程序,它有一个底部标签布局。 我的以下设置运行良好,除非第二个选项卡尚未加载。我的第一个viewcontroller(第一个选项卡)从secondviewcontroller调用一个观察到的方法:
VC1:
-(void) callmethodVC2 {
[[NSNotificationCenter defaultCenter]postNotificationName:@"MYFUNC" object:nil];
//switch to 2nd Tab
self.tabBarController.selectedIndex = 1;
}
VC2:
在viewDidLoad()
我注册:
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(loadSomething) name:@"MYFUNC" object:nil];
稍后在VC2中我实现了观察到的方法:
-(void) loadSomething {...}
所以VC1通过NotifacationCenter调用该方法 - >标签栏按预期切换,方法效果很好但仅如果我访问了第二个标签 之前。
我猜想当我在加载viewDidLoad方法之前访问第二个VC并且有注册的observe-method时!因此,如果我在未调用viewDidLoad方法之前没有访问VC2,也没有注册观察者方法。
如何在第一个VC中“预加载”第二个VC,这是推送第二个VC的正确方法吗?它是如何完成的?
答案 0 :(得分:1)
我认为您只需要预加载视图控制器来解决您的问题。我找到了和以前一样的solution。
答案 1 :(得分:1)
你是对的,viewDidLoad
只被调用一次,这是第一次在屏幕上显示视图。您应该在初始化程序中注册观察者,而不是在viewDidLoad
中进行注释。
如果您使用故事板:
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadSomething) name:@"MYFUNC" object:nil];
}
return self;
}
如果您的视图控制器以编程方式实例化:
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadSomething) name:@"MYFUNC" object:nil];
}
return self;
}