iOS:如何从自定义单例类更改当前UIViewController

iOS:如何从自定义单例类更改当前UIViewController,ios,iphone,objective-c,uiviewcontroller,singleton,Ios,Iphone,Objective C,Uiviewcontroller,Singleton,我有一个常见的问题,但找不到正确的解决方法,我将从头开始 我正在用游戏中心和配对制作一个游戏应用程序。我想接收和处理朋友的邀请。我制作了singleton类来处理所有游戏中心的东西。现在,我对如何处理邀请(我的意思是在整个应用程序中)表示怀疑 我的singleton确实可以处理它,并且我制定了附加协议,在收到邀请时调用委托方法。因此,我决定在我所有的UIViewController中实现这个协议(我不知道如何更好地实现这个协议,如果你知道的话,如果你能分享你的经验,我将不胜感激)。但现在,我遇到

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

我正在用游戏中心和配对制作一个游戏应用程序。我想接收和处理朋友的邀请。我制作了singleton类来处理所有游戏中心的东西。现在,我对如何处理邀请(我的意思是在整个应用程序中)表示怀疑

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

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


我希望我的问题是明确的,如果没有,我会提供图片来解释,只是让我知道在下面的评论。我认为这个问题很琐碎,有一些常见的做法。谢谢

不确定我是否完全理解这个问题,但请看一下UINavigationController:setViewControllers:并看看它是否是您想要的。
它将允许您将视图控制器的一个堆栈交换为另一个堆栈。要创建新堆栈,您可以使用[self.storyboard instantializeeviewcontrollerwhiteIdentifier:@“whatever”]

也许您需要的是通知

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

[[NSNotificationCenter defaultCenter] postNotificationName:@"AcceptInvitationNofity" object:self];
并将其添加到主菜单中:

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

在receiveEvent函数中,导航到GameVC。

我想我读到的内容中有两个问题。如果我错了,请纠正我

第一个问题,你是在问是否有更好的方法来处理单身人士处理诸如邀请之类的背景信息

现在,在每个控制器中都有一个具有委托的单例。我们不知道这些代理是否做了什么,以及它们对您的控制器有多专业。因为它存在于所有控制器中,所以我怀疑一旦调用委托,所有控制器都必须执行几乎相同的操作?在这种情况下,您应该有一个实现委派方法的BaseController,并且所有后续控制器都是该BaseController的子类。可以在子类中重写任何专用逻辑,并且可以调用[super delegateMethod]


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

-(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];
}

这将弹出当前视图控制器,并使您在保留GameModes控制器的同时降落到GameVC控制器上。

收到邀请后,您可以从当前UIViewController调用此命令:

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

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

您说得对,我的单身汉可以处理所有游戏中心事务,如身份验证、发送和接收邀请、配对。我想将我当前的ViewController(无论是什么)更改为我的游戏视图控制器(玩家在其中接受邀请)。所以,你是对的,我会尽力执行你的决定。