2014-01-20 3 views
0

У меня общая проблема, но я не могу найти правильный способ ее решения, я начну с самого начала.iOS: как изменить текущий UIViewController из пользовательского одноэлементного класса

Я создаю игровое приложение с игровым центром и сватовством. Я хочу получать и обрабатывать приглашения от друзей. Я сделал класс singleton, который обрабатывал все материалы Game Center. Прямо сейчас, я сомневаюсь в том, как обрабатывать приглашения (я имею в виду все приложение).

Мой синглтон обрабатывает его, и я сделал дополнительный протокол, который вызывает метод делегата при получении приглашения. Поэтому я решил реализовать этот протокол во всех своих UIViewControllers (я не знаю, как это сделать лучше, если вы знаете, что я очень признателен, если вы поделитесь своим опытом). Но теперь я застрял в проблеме, которая есть в названии. Мне нужно изменить свой UIViewController с текущего контроллера представления на «контроллер игрового представления» (он должен быть показан для игры). Я использую диспетчер навигации для своего приложения. Итак, есть ли способ изменить текущий контроллер представления на определенный контроллер представления из моего одноименного класса «Game Center stuff» или, по крайней мере, из текущего ViewController?

Например, я в контроллере представлений параметров, который поступает из главного контроллера меню (MainMenuVC → OptionsVC), и я получаю приглашение, и я принимаю его. Прямо сейчас я хочу перейти к «игровому контроллеру или GameVC», то есть местам в другом пути segue (MainMenuVC → Game ModesVC → GameVC).

Надеюсь, мой вопрос ясен, если нет, я предоставил изображения для объяснения, просто дайте мне знать в комментариях ниже. Я думаю, что этот вопрос довольно тривиален, и есть некоторые распространенные практики. Благодарю.

ответ

0

Не уверен, что я точно понимаю вопрос, но посмотрите на UINavigationController: setViewControllers: и посмотрите, может ли это быть тем, что вы после. Это позволит вам обменять один стек контроллеров для другого стека. Чтобы создать свой новый стек, вы можете использовать [self.storyboard instantiateViewControllerWithIdentifier: @ "whatever"]

0

Возможно, вам нужно уведомление.

добавить это OptionVC, после того, как вы примете приглашение, отправьте это сообщение:

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

и добавить к вашему MainMenuVC:

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

в функции receiveEvent, перейдите к GameVC.

0

Думаю, у вас есть 2 вопроса из того, что я прочитал. Поправьте меня если я ошибаюсь.

первого вопрос, вы спрашиваете, если есть лучший способ справиться с одноплодным, который имеет дело с фоновыми вещами, такими, как приглашения и т.д.

Так прямо сейчас, у вас есть одиночки с делегацией в каждом контроллере. Мы не знаем, что делают эти делегаты и как они специализируются на ваших контроллерах. Поскольку это во всех контроллерах, я подозреваю, что все контроллеры должны делать в основном одни и те же вещи после вызова делегации? В этом случае у вас должен быть BaseController, который реализует методы делегирования, и все последующие контроллеры являются подклассом этого BaseController. Любая специализированная логика может быть переопределена в подклассе и можно вызвать [super delegateMethod].


второй вопрос вы спрашиваете, если вы можете переходить от одного SEGUE потока в другой поток SEGUE в пределах того же UINavigationController. Это легко. Вам нужно дать своим контроллерам на раскадровке идентификатор, создать экземпляр этих контроллеров с использованием идентификатора, поместить его в массив, а затем установить массив ControlController Controller для этого нового массива. Вот несколько примеров, чтобы проиллюстрировать это.

-(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.

+0

Вы правы, мой синглтон управляет всеми игровыми центрами такими вещами, как аутентификация, отправка и получение приглашений, сватовство. И я хочу изменить свой текущий ViewController (что бы это ни было) на мой контроллер игрового представления (где игрок принимает приглашение). Итак, вы правы, и я постараюсь выполнить ваше решение. –

0

Получив приглашение, вы можете назвать это от вашего текущего UIViewController:

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

где «GameVCIdentifier» является идентификатором UIViewController вы хотите показать. Вы можете установить идентификатор внутри своей раскадровки.

Смежные вопросы