0

我有 2 个 UI 视图,它们都带有连接到选项卡控制器的控制器。

ViewA - 用于身份验证(包含登录文本字段和提交按钮)

ViewB - 用于显示配置文件。

我已使用情节提要中的实用程序管理器将 ViewB 设置为禁用,这是为了防止用户在登录前单击选项卡。在 ViewA 中进行身份验证后,我想通知 ViewB 启用自身并显示配置文件。

从谷歌搜索看来,使用 NSNotificationcenter 是最好的方法,我创建了一个可以正常工作的简单 postNotifiaction - 但我不确定在 ViewB 中的何处添加接收器,我无法在 ViewDidLoad 中添加它,因为它不加载,并被禁用开始?

通知中心是最好的方法吗?

另外,我如何向禁用的视图发送通知?

谢谢

4

5 回答 5

0

您是否禁用了视图或选项卡按钮?

如果您禁用选项卡按钮,您可以启用它并通过执行切换到配置文件选项卡

self.tabBarController.selectedViewController = profileViewController;

您可以将此代码放在 ViewA 的视图控制器中。要获取 profileViewController,您可以改用此代码

 self.tabBarController.selectedViewController = [self.tabBarController.viewControllers objectAtIndex:1]

假设您的个人资料位于索引 1

于 2012-08-02T10:49:23.253 回答
0

http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/Reference/Reference.html

上面的 Apple 文档链接非常清楚地指出 NSNotificationCenter 不保留它的观察者,这就是为什么你不能在那里释放 dataAnalyzer - 它会被释放,并且通知会尝试发布到 nil 引用。

在每个视图控制器的 -init 方法中订阅通知。这确保了控制器已被创建和初始化,并使每个控制器对其自己的操作负责。

我不完全确定您的问题是什么,如果上述内容不能解决您的问题,您能否改写一下。

另外,请注意 NSNotificationCenter 将发布给所有观察者,但它不是异步的 - 它会等待每个观察者完成处理通知,然后再发送到下一个对象。

于 2012-08-02T10:47:19.387 回答
0

为什么你不只是调用[viewB enableItselfSomehow];方法-someAuthenticationSucceedFeedback

注册仅启用/禁用视图的通知对我来说是一个糟糕的基调

于 2012-08-02T10:58:14.960 回答
0

当然,您有一个控制 ViewB 的禁用状态的控制器(AppDelegate,如果有的话)?您可以侦听来自此控制器实例的通知,并在收到通知后从中启用 ViewB。

如果您必须从 ViewB 订阅通知,则在其(ViewB 的)init 方法中注册它(不要忘记在 dealloc 方法中取消订阅通知)。这应该可以工作,因为即使用于访问 ViewB 的按钮被禁用,ViewB 实例也会在您的应用程序启动时被实例化(或者我假设......)。

如果您在点击按钮之前不实例化 ViewB,那么您必须让启用/禁用 ViewB 按钮的控制器负责侦听通知并启用按钮访问 ViewB。

于 2012-08-02T10:52:37.007 回答
0

我认为这个逻辑有点模棱两可。这是我对您的应用程序的理解:

-> 标签栏控制器

---> 控制器 1 - 登录

---> 控制器 2 - 配置文件(默认禁用)

您不必将通知插入控制器 2,而是插入 TabBar,因为它“控制”其他控制器(对不起,笑话这个词)。我认为最好的解决方案是:

标签栏

观察有关“用户已更改”的通知并检查它:如果用户已登录,则启用配置文件控制器,如果用户是匿名的,则禁用它。

控制器 1 - 登录

当用户登录/注销时,会发出“用户已更改”的通知。

就是这样,您的控制器 2 可以在不知道用户状态的情况下生存。如果您在编码此逻辑时遇到问题,请告诉我。

于 2012-08-02T10:55:31.333 回答