ObjectiveC: Добавить / выполнить несколько переходов в навигационном контроллере - PullRequest
0 голосов
/ 11 июня 2019

Я реализую функцию приложения, в которой есть 6-7 экранов. И пользователь может оставить / закрыть поток на любом экране.

Но когда пользователь снова подает заявку на приложение, он должен перейти к последнему экрану, где он оставил, а также он может вернуться к предыдущим экранам.

Например: я начал подавать заявку и закончил до 4-го экрана и закрылся. Снова применимо, я должен перейти прямо к 4-му экрану и также иметь возможность вернуться на 3-й-> 2-й-> 1-й экран из стека.

Текущий код:

Segue идентифицирует экраны с 1-7 по Storyboard как "screen1", "screen1" ... "screen7"

с HomeScreen.m

-(void)toPersonalApplication {

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Personal" bundle:nil];
    ScreenOne *screenOne = [storyboard instantiateViewControllerWithIdentifier:@"screenOne"];
    UINavigationController* nav = [[UINavigationController alloc] initWithRootViewController:screenOne];
    [self presentViewController:nav animated:YES completion:nil];
}

Проверка того, запустил ли пользователь процесс приложения

On ScreenOne.m

   - (IBAction)btnNextClick:(id)sender {

        if (doneProcessTill == 4) {

        // Should be execute something like this here
        // [self performSegueWithIdentifier:@"screen2" sender:self];
        // [self performSegueWithIdentifier:@"screen3" sender:self];
        // [self performSegueWithIdentifier:@"screen4" sender:self];
      }

    }

Ценю ваше предложение! Спасибо

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Как указано в моем комментарии, решение может выглядеть так:

- (void)toPersonalApplication {
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Personal" bundle:nil];

    NSMutableArray *viewControllers = [NSMutableArray array];
    for (NSInteger i = 1; i <= doneProcessTill; ++i) {
        UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:[NSString stringWithFormat:@"screen%ld", (long)i]];
        [viewControllers addObject:viewController];
    }

    UINavigationController *navigationController = [UINavigationController new];
    navigationController.viewControllers = viewControllers;

    [self presentViewController:navigationController animated:YES completion:nil];
}
0 голосов
/ 11 июня 2019

В этом случае было бы лучше сохранить ваши контроллеры представления и затем показать их снова, как только вы захотите вернуться туда, где вы были. В любой момент вы можете получить текущие контроллеры представления, использующие navigationController.viewControllers. И для установки всего стека все, что вам нужно сделать, это вызвать setViewControllers на вашем контроллере навигации.

Вы можете переопределить контроллер навигации, чтобы сохранить массив контроллеров. Или вы можете просто сохранить его статически. Что удобнее в вашем случае.

Статический будет выглядеть примерно так:

static NSArray<UIViewController *> *__preservedControllers = nil;

@implementation ViewController

- (void)onClose {
    __preservedControllers = self.navigationController.viewControllers;
    // Insert logic to close the whole procedure
}

- (void)reopenSavedStack {
    if(__preservedControllers) {
        [self.navigationController setViewControllers:__preservedControllers animated:YES];
        __preservedControllers = nil;
    }
}

С субклассом контроллера навигации это может выглядеть намного лучше, хотя:

@interface MyNavigationController : UINavigationController

@property (nonatomic, strong) NSArray<UIViewController *> *savedStack;

@end

@implementation MyNavigationController

- (void)saveStack {
    self.savedStack = self.viewControllers;
}

- (void)restoreStack:(BOOL)animated {
    if(self.savedStack.count > 0) {
        [self setViewControllers:self.savedStack animated:YES];
        self.savedStack = nil;
    }
}

@end

Но тогда вам нужно набрать еще раз:

- (void)onClose {
    [(MyNavigationController *)self.navigationController saveStack];
    // Insert logic to close the whole procedure
}

- (void)reopenSavedStack {
    [(MyNavigationController *)self.navigationController restoreStack:YES];
}
...