Как сделать две операции UINavigationController из одного метода? - PullRequest
3 голосов
/ 29 октября 2009

Часто я чувствую, что мне нужно отменить текущий модальный контроллер вида, а затем сразу же нажать другой контроллер вида (поэтому представьте, что что-то скользит вниз, а затем скользит вправо). Какой умный способ сделать это?

Если вы попытаетесь выполнить эти две операции все сразу, выполняется только первая, вторая игнорируется.

-(void)dismissThenPush{
[self.navigationController dismissModalViewControllerAnimated:TRUE]; //works
[self.navigationController pushViewController:controller animated:TRUE];    //ignored
}

В течение последних 12 месяцев я устанавливал некоторый глобальный флаг, чтобы исходный контроллер проверял этот флаг в методе viewDidAppear, а затем вызывал метод pushViewController. Но я устал от этого взлома, должен быть способ сделать все это за один раз из модального контроллера представления.

Ответы [ 3 ]

1 голос
/ 29 октября 2009

Я просто поиграл с этим. Я закончил с этим:

  1. Передайте (оригинальный) контроллер вида модальному контроллеру вида через свойство. Следующий контроллер представления (который нужно будет выдвинуть) также может быть передан как свойство (если оно не всегда одно и то же).
  2. Представить модальный вид.
  3. В методе контроллера модального вида, который отклоняет модальное представление, также нажмите контроллер следующего вида, получив доступ к контроллеру навигации из свойства исходного контроллера вида.

В конечном итоге анимация скольжения вниз и вправо происходит одновременно, но я думаю, что это выглядит нормально.

Код:
В исходном виде контроллер:

- (IBAction)pushModalVC {
    ModalViewController *modalVC = [[ModalViewController alloc] init];

    modalVC.ownerVC = self;

    [self presentModalViewController:modalVC animated:YES];

    [modalVC release];
}

В контроллере модального вида:

- (IBAction)pushSecondVC {
    // this could be accessed via a property rather than loading
    SecondViewController *secondVC = [[SecondViewController alloc] init];

    [self dismissModalViewControllerAnimated:YES];

    [ownerVC.navigationController pushViewController:secondVC animated:YES];

    [secondVC release];
}
0 голосов
/ 23 июня 2010

Хитрость заключается в том, чтобы не оживлять первый переход.

[self.navigationController dismissModalViewControllerAnimated:NO];
[self.navigationController pushViewController:controller animated:YES];  

Работает.

0 голосов
/ 29 октября 2009

Я уже ответил на нечто подобное ранее (см. вопрос ) с тем же решением, которое вы используете в настоящее время (см. Пункт 2 моего ответа), но я подумал о чем-то вроде обработки флага не как логическое значение, а чтобы сделать это с помощью enum, поэтому достаточно будет 1 переменную.

typedef enum {
    ViewControllerPushControllerNone,
    ViewControllerPushControllerSettings,
    ViewControllerPushControllerWhatever
} ViewControllerPushController;

@interface ViewController : UIViewController {
    ViewControllerPushController _pushController;
}
@property(nonatomic, assign) ViewControllerPushController pushController;

@end




@implementation ViewController

@synthesize pushController = _pushController;

- (void)viewDidAppear:(BOOL)animated {
    switch(self.pushController){
        case ViewControllerPushControllerSettings:
            // Push Settings controller
        break;
        case ViewControllerPushControllerWhatever:
            // Push Whatever controller
        break;
    }
    self.pushController = ViewControllerPushControllerNone;

    [super viewDidAppear:animated];
}

@end

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

РЕДАКТИРОВАТЬ Вы также можете установить свойство как класс, чтобы вам не приходилось связываться с enum typedef. Затем вы могли бы также опустить оператор switch, потому что тогда вы можете сделать что-то вроде:

- (void)viewDidAppear:(BOOL)animted {
    if(self.pushController != nil){
        NSString *selector = [NSString stringWithFormat:@"push%@", NSStringFromClass(self.pushController)];
        [self performSelector:NSSelectorFromString(selector)];
    }
    self.pushController = nil;

    [super viewDidAppear:animated];
}

- (void)pushSettingsViewController {
    if(_settingsViewController == nil){
        _settingsViewController = [[SettingsViewController alloc] init];
    }

    [self.navigationController pushViewController:_settingsViewController animated:YES];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...