我有2个UI视图,两个控制器都连接到选项卡控制器。
ViewA - 用于身份验证(包含登录文本字段和提交按钮)
ViewB - 用于显示个人资料。
我已使用故事板中的实用程序管理器将ViewB设置为禁用,这是为了防止用户在登录前单击选项卡。在ViewA中进行身份验证后,我想通知ViewB启用自身并显示配置文件。
从谷歌搜索看来,使用NSNotificationcenter是最好的方法,我创建了一个简单的postNotifiaction工作正常 - 但我不确定在ViewB中添加接收器的位置,我无法在ViewDidLoad中添加它,因为它确实如此没有加载,并且被禁用以开始?
通知中心是最好的方法吗?
另外,我如何向已禁用的视图发送通知?
由于
答案 0 :(得分:0)
上面的Apple文档链接非常清楚地表明NSNotificationCenter没有保留它的观察者,这就是为什么你不能在那里发布dataAnalyzer - 它将被解除分配并且通知将尝试发布到nil引用。
在每个视图控制器的-init方法中订阅通知。这确保了控制器的创建和初始化,并使每个控制器对其自己的行为负责。
我不完全确定你的问题是什么,如果以上问题无法解决你的问题,你能否改写一下。
另外,请注意NSNotificationCenter将发布给所有观察者,但它不是异步的 - 它等待每个人在发送到下一个对象之前完成处理通知。
答案 1 :(得分:0)
您是否禁用了视图或标签按钮?
如果禁用标签按钮,则可以启用它并通过执行
切换到配置文件标签self.tabBarController.selectedViewController = profileViewController;
您可以将此代码放在ViewA的视图控制器中。要获取profileViewController,您可以使用此代码
self.tabBarController.selectedViewController = [self.tabBarController.viewControllers objectAtIndex:1]
假设您的个人资料位于索引1
答案 2 :(得分:0)
当然,你有一个控制器(AppDelegate,如果有的话)控制ViewB的禁用状态?您可以侦听来自此控制器实例的通知,并在收到通知后从中启用ViewB。
如果您必须订阅ViewB的通知,请在其(ViewB的)init方法中注册(不要忘记取消订阅dealloc方法中的通知)。这应该有效,因为即使用于访问ViewB的按钮被禁用,ViewB实例也会通过启动你的应用程序来实例化(或者我假设......)。
如果在点击按钮之前没有实例化ViewB,那么您必须让控制器启用/禁用ViewB按钮,负责监听通知并启用按钮访问ViewB。
答案 3 :(得分:0)
我认为这种逻辑有点含糊不清。这是我对您的申请的理解:
- >标签栏控制器
--->控制器1 - 登录
--->控制器2 - 配置文件(默认禁用)
您不必将通知插入到控制器2中,而是插入TabBar,因为它"控制"其他控制器(对不起笑话这个词)。我认为最好的解决办法就是:
<强>的TabBar 强>
关于&#34;用户已更改的通知的观察员&#34;并检查它:如果用户已登录,则启用配置文件控制器,如果用户是匿名的,则禁用它。
控制器1 - 登录
当用户登录/注销时,会发出&#34;用户更改&#34;的通知。
总而言之,您的控制器2可以在不知道用户状态的情况下生存。如果您对此逻辑编码有问题,请告诉我。
答案 4 :(得分:0)
为什么你不只是在[viewB enableItselfSomehow];
方法中拨打-someAuthenticationSucceedFeedback
?
仅为启用/禁用视图注册通知对我来说是一个糟糕的基调