【问题标题】:Update previously pushed view controllers via delegation IOS6通过委托 IOS6 更新之前推送的视图控制器
【发布时间】:2013-08-07 04:45:36
【问题描述】:

我仍然掌握 IOS 委托的窍门,所以我希望这个问题在我解释我想要做的事情时有意义...

我想要做的是在我的应用首次运行后立即在后台线程上下载一些 JSON 数据。然后将解析数据,然后更新全局变量。一旦发生这种情况,我希望所有以前推送的视图控制器根据已下载和解析的数据更新其内容。

我建议的解决此问题的方法是让我的应用程序委托或我的自定义导航控制器子类成为将解析数据的自定义 JSON 对象的委托。解析完成后,委托将运行一个更新全局变量的协议方法。

现在,一旦设置了这个变量,任何被推送到导航堆栈的视图控制器都可以使用它。我还想更新之前推送的视图控制器,以便更新它们的内容。

我知道我可以让顶部视图控制器成为一个活动委托,它将运行一个协议,但是之前推送的视图控制器呢?这甚至可能吗,还是有其他方法可以让以前推送的视图控制器更新其内容?

【问题讨论】:

    标签: ios ios6


    【解决方案1】:

    在这种情况下,您并不想使用委托。您希望多个对象监听特定事件,因此请改用NSNotificationCenter

    当您的解析器完成 JSON 解析后,请执行以下操作:

    [[NSNotificationCenter defaultCenter] postNotificationName: @"FinishedDataParsing" object:self userInfo:nil;
    

    这样您也不需要全局变量。您可以在解析器对象中使解析的数据可访问,也可以使用 userInfo 字典将一些信息传递给通知接收器。

    当你的解析完成后你想在任何地方做某事,你首先必须注册为观察者(你可以在viewDidLoad中做到这一点):

     [[NSNotificationCenter defaultCenter] addObserver:self
        selector:@selector(dataParsed:) 
        name:@"FinishedDataParsing"
        object:nil];
    

    显然你必须实现你的回调方法来对你解析的数据做任何你想做的事情。

    - (void)dataParsed:(NSNotification *)notification {
          // Do this to access the user info.
          NSDictionary *userInfo = notification.userInfo;
    
          // Or access your data parser object.
          DataParser *parser = (DataParser *)notification.object;
    }
    

    此外,当您不再需要收到通知时(例如在dealloc),您应该取消注册为观察者

    - (void) dealloc
    {
       [[NSNotificationCenter defaultCenter] removeObserver:self];
       [super dealloc];
    }
    

    【讨论】:

    • 哇,这听起来是个不错的选择。我一定会试一试的。但是有一个问题,取消注册为观察员有多重要?原因是因为我认为我必须通过根据需要重新下载 JSON 数据来为用户添加更新应用程序内容的能力。
    • 是的,您必须注销,否则您的应用可能会崩溃。如果您在viewDidLoad 注册并在dealloc 注销,您将被保存。这样,当您的视图控制器处于活动状态时,您将始终收到通知。
    猜你喜欢
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    相关资源
    最近更新 更多