Как выполнить Segue с задержкой
В моей раскадровке у меня есть представление в качестве заставки. В этом представлении у меня уже есть кнопка типа "Открыть приложение", которая открывает вид меню с помощью модального сегмента. Но я также хочу, чтобы экран выполнял segue автоматически, например, через 2 секунды.
Код здесь:
- (void)viewDidAppear:(BOOL)animated
{
[self performSegueWithIdentifier:@"splashScreenSegue" sender:self];
}
Как вы можете видеть, я уже использую функцию performSegueWithIdentifier, но он выполняется немедленно. Есть ли способ заставить его задерживаться?
Спасибо заранее.
Ответы
Ответ 1
Вы можете использовать GCD dispatch_after
для выполнения вашего кода segue через 2 секунды после появления представления, e.x:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[self performSegueWithIdentifier:@"splashScreenSegue" sender:self];
});
}
Кроме того, убедитесь, что вы помните, что вызываете супер-реализацию при переопределении методов жизненного цикла UIViewController.
Ответ 2
Я думаю, что есть лучший подход, который позволяет самому контроллеру решать проблемы диспетчеризации. Вы можете достичь этого следующим образом:
сначала создайте такой метод, который позже вы будете использовать его селектор
- (void)showAnotherViewController{
[self performSegueWithIdentifier:@"yourSegueToAnotherViewController" sender:self];
}
Затем, когда вы хотите показать другой контроллер представления после задержки, используйте эту строку кода внутри текущего контроллера представления:
[self performSelector:@selector(showAnotherViewController) withObject:nil afterDelay:yourDelayInSeconds];
Ответ 3
В Swift 4.2 вы можете добиться этого, позвонив:
DispatchQueue.main.asyncAfter(deadline: .now() + 0.8) { [unowned self] in
self.performSegue(withIdentifier: "your segue id", sender: nil)
}