iOS - 使用 NSNotificationCenter 的生命周期

Posted

技术标签:

【中文标题】iOS - 使用 NSNotificationCenter 的生命周期【英文标题】:iOS - Lifecycle using NSNotificationCenter 【发布时间】:2017-06-22 15:36:55 【问题描述】:

我有一个具有底部选项卡布局的 ios (Objective C) 应用程序。 我的以下设置运行良好,除非尚未加载第二个选项卡。我的第一个视图控制器(第一个选项卡)从第二个视图控制器调用了一个观察到的方法:

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 并且有注册的观察方法!因此,如果我在没有调用 viewDidLoad 方法之前没有访问 VC2,也没有注册观察者方法。

如何在我的第一个 VC 中“预加载”第二个 VC,这是推送第二个 VC 的正确方法吗?又是如何做到的?

【问题讨论】:

【参考方案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;

【讨论】:

谢谢 - 这就是我需要知道的!【参考方案2】:

我认为您只需要预加载视图控制器即可解决您的问题。我为您找到了与我之前使用的相同的solution。

【讨论】:

以上是关于iOS - 使用 NSNotificationCenter 的生命周期的主要内容,如果未能解决你的问题,请参考以下文章

[iOS] 在 ios10 中使用 imessage

使用 SmartFace.io 录制音频(Android - Ios)

iOS - 如何使用 branch.io 在 Appstore 中测试深度链接

IOS AlterView的使用(IOS8.0以前使用)

iOS归档使用

Agora.io - 如何使用 mediaPlayer 共享视频时间戳? - iOS