Что делать, если пользователь не использует навигационный контроллер. Пожалуйста, сначала прочитайте вопрос, а затем ответьте.

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

Поэтому я хочу создать функцию, которая отклонит все контроллеры представления, независимо от того, будет ли она вставлена ​​в контроллеры навигации, представлена ​​модально или открыта какими-либо методами.

Я пробовал разные способы, но я не смог уволить все контроллеры представления. Есть ли простой способ?

 Amrit Tiwari16 нояб. 2017 г., 06:41
Вы можете изменить контроллер корневого представления.
 miOS16 нояб. 2017 г., 06:41
Сброс rootviewcontroller окна приложения решит проблему.
 Sagar Bhut16 нояб. 2017 г., 06:38
Вы можете использовать navigationcontroler.poptorootcontroller
 Byoth16 нояб. 2017 г., 07:51
Всем спасибо. Я собрал ваше мнение и решил.
 Paulw1116 нояб. 2017 г., 06:43
Вы используете segues? Если это так, то раскрутить сеуг - это самый простой способ

Ответы на вопрос(11)

Создать раскрутить Segue (Вы можете найти его наhttps://developer.apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/UsingSegues.html авторские права Apple Inc.)

Размотка сегментов позволяет вам отказаться от представленных контроллеров представления. Вы создаете раскручивающиеся сегменты в Интерфейсном Разработчике, связывая кнопку или другой подходящий объект с объектом Exit текущего контроллера представления. Когда пользователь нажимает кнопку или взаимодействует с соответствующим объектом, UIKit ищет в иерархии контроллера представления объект, способный обрабатывать последовательность откручивания. Затем он отклоняет текущий контроллер представления и любые промежуточные контроллеры представления, чтобы выявить цель развернутого перехода.

Создать раскручивающийся переход

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

Определите метод действия по размотке на выбранном контроллере вида.

Синтаксис Swift для этого метода выглядит следующим образом:

@IBAction func myUnwindAction(unwindSegue: UIStoryboardSegue)

Синтаксис Objective C для этого метода выглядит следующим образом:

- (IBAction)myUnwindAction:(UIStoryboardSegue*)unwindSegue

3. Перейдите к контроллеру представления, который инициирует действие раскручивания.

Удерживая нажатой клавишу «Control», нажмите кнопку (или другой объект), которая должна инициировать переход. Этот элемент должен быть в контроллере представления, который вы хотите удалить.

Перетащите к объекту Exit вверху сцены контроллера вида.

https://developer.apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/Art/segue_unwind_linking_2x.png

Выберите способ действия для размотки на панели отношений.

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

Используйте этот код для отклонения представленных viewcontrollers и перехода к навигации rootviewcontroller swift 4

// MARK:- Dismiss and Pop ViewControllers
func dismissPopAllViewViewControllers() {
    if let appDelegate = UIApplication..delegate as? AppDelegate {
        appDelegate.window?.rootViewController?.dismiss(animated: true, completion: nil)
        (appDelegate.window?.rootViewController as? UINavigationController)?.popToRootViewController(animated: true)
    }
}
 func  dismiss_all(view: UIView){
   view.window!.rootViewController?.dismiss(animated: true, completion: nil)

 }

trolller в rootViewController.

let destination = HomeVC()
let appDelegate:UIApplicationDelegate = UIApplication.shared.delegate!
let initialViewController = destination
let navigationController = UINavigationController(rootViewController: initialViewController)
appDelegate.window??.rootViewController = navigationController
appDelegate.window??.makeKeyAndVisible()
 Syed Qamar Abbas16 нояб. 2017 г., 06:51
Что делать, если пользователь не использует навигационный контроллер. Пожалуйста, сначала прочитайте вопрос, а затем ответьте.
 Umesh Verma16 нояб. 2017 г., 06:50
self.navigationController? .popToRootViewController (animated: true) использовать эту синпету
 Syed Qamar Abbas16 нояб. 2017 г., 06:46
Вопрос заключался в том, чтобы уволить все viewController, чтобы не устанавливать rootViewController.
 Syed Qamar Abbas16 нояб. 2017 г., 06:48
Вы хотите заново создать новый viewController при нажатии на кнопку закрытия? Что делать, если пользователь не хочет создавать новый VC, но хочет вернуться к тому же экземпляру, как описано в предыдущем вопросе.
 Umesh Verma16 нояб. 2017 г., 06:47
Вы можете вызвать этот метод, когда нажмете кнопку закрытия. Это установит ваш контроллер на rootviewcontroller и удалит все остальные ViewController

вы можете использовать первый или, если вы представляете модально, вы можете использовать второй:

Для навигации
self.navigationController?.popToRootViewController(animated: true)
Для представления модально
self.view.window!.rootViewController?.dismissViewControllerAnimated(false, completion: nil)
 Sandip Gill11 мая 2018 г., 08:55
Erhan Demirci, пожалуйста, дорогой
 Erhan Demirci10 мая 2018 г., 17:34
работал спасибо

Размотка сегментов дает вам возможность «раскрутить» навигационный стек обратно через сегменты push, modeal, popover и другие типы сегментов. Вы используете раскручивающиеся сегменты, чтобы «вернуться» на один или несколько шагов в иерархии навигации.

Ссылка на документацию:https://developer.apple.com/library/archive/technotes/tn2298/_index.html

 SalmonKiller15 мар. 2019 г., 00:14
Привет, добро пожаловать в Stack Overflow! Не могли бы вы опубликовать пример создания перехода в дополнение к выдержкам и ссылку на документацию? Спасибо!
 Srinath Shah16 мар. 2019 г., 06:42
Я добавлю еще один ответ для удобочитаемости.

чего вы хотите, измените ваш стек навигации, затем выполните popViewController.

let allControllers = NSMutableArray(array: navigationController!.viewControllers)
let vcCount = allControllers.count
for _ in 0 ..< vcCount - 2 {
    allControllers.removeObject(at: 1)
}
// now, allControllers[0] is root VC, allControllers[1] is presently displayed VC. write back to nav stack
navigationController!.setViewControllers(allControllers as [AnyObject] as! [UIViewController], animated: false)
// then pop root VC
navigationController!.popViewController(animated: true)

Видетьэто для способа дальнейшего манипулирования стеком навигации. Если ваш верхний VC является модальным, отклоните его перед кодом выше.

Свифта-4

для возврата к контроллеру корневого представления вы можете просто вызвать строку кода, и ваша работа будет завершена.

 self.view.window?.rootViewController?.dismiss(animated: true, completion: nil)

и если у вас есть заставка и после этого экран входа и вы хотите перейти на экран входа, вы можете просто добавитьpresentedviewcontroller в приведенном выше коде

self.view.window?.rootViewController?.presentedViewController!.dismiss(animated: true, completion: nil)

Просто спроситеrootViewController уволить любогоViewController если представить.

if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
   appDelegate.window?.rootViewController?.dismiss(animated: true, completion: nil)
   (appDelegate.window?.rootViewController as? UINavigationController)?.popToRootViewController(animated: true)
}
 somenickname21 мая 2018 г., 23:58
Это работает для меня, когда у меня нетself ссылка на текущее окно
 Syed Qamar Abbas16 нояб. 2017 г., 07:53
Отредактированный ответ для вас. Сначала будет удален весь viewController, а затем вытолкнут весь viewController, если корнем является UINavigationController.
 Byoth16 нояб. 2017 г., 07:51
Благодарю. Он полностью работает для всех представленных контроллеров представления, но не работает для контроллеров push-представлений (если корневой контроллер представления является контроллером навигации). поэтому я также отразил вместе другие мнения, которые с помощьюpopToRootViewController и я решил это :)

self.view.window?.rootViewController?.dismiss(animated: true, completion: nil)

это должно отклонить все контроллеры представления выше корневого контроллера представления.

Если это не сработает, вы можете сделать это вручную, запустив цикл while, как этот.

func dismissViewControllers() {

    guard let vc = self.presentingViewController else { return }

    while (vc.presentingViewController != nil) {
        vc.dismiss(animated: true, completion: nil)
    }
}

Он будет отклонять все viewControllers, пока у него нет текущего контроллера.

Редактировать : если вы хотите отклонить / вытолкнуть ViewControllers, вы можете использовать

self.navigationController?.popToRootViewController(animated: true)

Надеюсь, это поможет.

 Zahurafzal Mirza28 мая 2018 г., 09:18
Что если я захочу представить контроллер представления ... до определенного количества .. из цикла for ... скажем, если число равно 5 .. то 5 раз должен быть представлен тот же контроллер представления ... возможно ли это?
 Agent Smith16 нояб. 2017 г., 10:16
@Byoth Отредактировал ответ.
 Byoth16 нояб. 2017 г., 07:51
Благодарю. Он полностью работает для всех представленных контроллеров представления, но не работает для контроллеров push-представлений (если корневой контроллер представления является контроллером навигации). поэтому я также отразил вместе другие мнения, которые с помощьюpopToRootViewController и я решил это :)
 Zahurafzal Mirza28 мая 2018 г., 11:16
Нет, я хочу представить один контроллер представления 5 раз. Я выполнил кодирование, но представлен только последний. Можете ли вы дать мне обзор того, как это сделать?
 Agent Smith28 мая 2018 г., 10:50
@ZahurafzalMirza Вы хотите представить viewController после того, как щелкнули 5 раз, или вы хотите представить один контроллер представления 5 раз?

кроме корневого контроллера представления, и обновляет отображение.

func popToRootViewController(animated: Bool)

Но если вы хотите перейти на конкретный контроллер, просто используйте функцию ниже.

func popToViewController(UIViewController, animated: Bool)

Вызывает контроллеры представления, пока указанный контроллер представления не находится на вершине стека навигации.

Ваш ответ на вопрос