【问题标题】:iOS: how to change current UIViewController from custom singleton classiOS:如何从自定义单例类更改当前 UIViewController
【发布时间】:2014-01-20 23:51:32
【问题描述】:

我有一个常见的问题,但找不到正确的方法来解决它,我会从头开始。

我正在制作一个带有游戏中心和匹配功能的游戏应用。我想接收和处理来自朋友的邀请。我制作了处理所有 Game Center 东西的单例类。现在,我对如何处理邀请有疑问(我的意思是在整个应用程序中)。

我的单例确实处理了它,并且我制作了在收到邀请时调用委托方法的附加协议。所以,我决定在我所有的 UIViewControllers 中实现这个协议(我不知道如何以更好的方式做到这一点,如果你知道,如果你分享你的经验,我将不胜感激)。但是现在,我遇到了一个标题中的问题。我需要将我的 UIViewController 从当前视图控制器更改为“游戏视图控制器”(必须为游戏显示)。我为我的应用程序使用导航视图控制器。 那么,有没有办法从我的“Game Center stuff”单例类或至少从当前的 ViewController 中将当前视图控制器更改为特定的视图控制器?

例如,我在选项视图控制器中,即来自主菜单视图控制器(MainMenuVC→OptionsVC),我收到邀请并接受它。现在我想转到“游戏视图控制器或 GameVC”,即位于另一个 segue 路径(MainMenuVC→Game ModesVC→GameVC)。

我希望我的问题很清楚,如果没有,我会提供图片来解释,请在下面的 cmets 中告诉我。我认为这个问题很琐碎,并且有一些常见的做法。谢谢。

【问题讨论】:

    标签: ios iphone objective-c uiviewcontroller singleton


    【解决方案1】:

    不确定我是否完全理解该问题,但请查看 UINavigationController:setViewControllers: 看看它是否是您所追求的。 它将允许您将一个视图控制器堆栈交换为另一个堆栈。要创建新堆栈,您可以使用 [self.storyboard instantiateViewControllerWithIdentifier: @"whatever"]

    【讨论】:

      【解决方案2】:

      也许您需要的是通知。

      将此添加到 OptionVC,在您接受邀请后,发送此消息:

      [[NSNotificationCenter defaultCenter] postNotificationName:@"AcceptInvitationNofity" object:self];
      

      并将其添加到您的 MainMenuVC:

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

      在 receiveEvent 函数中,导航到 GameVC。

      【讨论】:

        【解决方案3】:

        我认为您对我阅读的内容有 2 个问题。如我错了请纠正我。

        第一个问题,您问是否有更好的方法来处理处理邀请等背景内容的单身人士。

        所以现在,您在每个控制器中都有一个带有委托的单例。我们不知道这些代表是做什么的,也不知道他们对您的控制器有多专业。由于它在所有控制器中,我怀疑一旦调用委托,所有控制器都必须做大部分相同的事情?在这种情况下,您应该有一个实现委托方法的 BaseController,并且所有后续控制器都是该 BaseController 的子类。任何专门的逻辑都可以在子类中被覆盖,并且可以调用[super delegateMethod]。


        第二个问题是您是否可以在同一个 UINavigationController 中从一个 segue 流转到另一个 segue 流。那很容易。您需要给情节提要上的控制器一个标识符,使用该标识符实例化这些控制器,将它们全部放入一个数组中,然后将导航控制器的控制器数组设置为该新数组。这里有一些代码来说明这一点。

        -(void)someButtonPressed {
            NSMutableArray *viewControllers = [self.navigationController viewControllers].mutableCopy;
            [viewController removeLastObject];
            [viewController addObject:[self.storyboard instantiateViewControllerWithIdentifier:@"GameModes"]];
            [viewController addObject:[self.storyboard instantiateViewControllerWithIdentifier:@"GameVC"]];
            [self.navigationController setViewControllers:viewControllers];
        }
        

        这将弹出您当前的视图控制器并让您登陆 GameVC 控制器,同时保留 GameModes 控制器。

        【讨论】:

        • 你说得对,我的单身人士处理所有 Game Center 事务,例如身份验证、发送和接收邀请、配对。我想将我当前的 ViewController(不管它是什么)更改为我的游戏视图控制器(玩家接受邀请的地方)。所以,你是对的,我会努力执行你的决定。
        【解决方案4】:

        收到邀请后,您可以从当前的 UIViewController 调用它:

        UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"GameVCIdentifier"];
        [self.navigationController pushViewController:controller animated:YES];
        

        其中“GameVCIdentifier”是您要显示的 UIViewController 的标识符。您可以在 Storyboard 中设置标识符。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-01-18
          • 2015-06-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-14
          • 2011-03-04
          • 1970-01-01
          相关资源
          最近更新 更多