Есть много способов сделать это, как просто передать контроллер вида в качестве свойства для нового экземпляра. Но в вашем случае может возникнуть больше смысла создавать статическую переменную, которая держит стек контроллеров вида так же, как это делает навигационный контроллер.
Если вы делаете это только между подклассами UIViewController
, я предлагаю вам создать другой подкласс этой формы, который наследует все остальные контроллеры представлений. Назовем это TrackedViewController
.
class TrackedViewController : UIViewController {
static var currentViewController: TrackedViewController?
static var previousViewController: TrackedViewController?
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
TrackedViewController.previousViewController = TrackedViewController.currentViewController
TrackedViewController.currentViewController = self
}
}
Теперь вы должны изменить все контроллеры зрения вы хотите, чтобы отслеживать, так что все они наследуют от TrackedViewController
в class MyViewController : TrackedViewController {
. И это в значительной степени. Теперь в любой точке вашего проекта вы можете найти свой текущий контроллер вида через TrackedViewController.currentViewController
и предыдущий контроллер вида через TrackedViewController.previousViewController
. Так что вы можете сказать что-то вроде:
if let myController = TrackedViewController.previousViewController as? MyViewController {
// Code here if the screen was reached from MyViewController instance
}
Теперь, как я сделал это через экземпляр контроллера вид, который может иметь некоторые побочные эффекты.
- Самая большая проблема, с которой вы можете столкнуться, заключается в том, что предыдущий контроллер сохраняется вместе с контроллером текущего вида. Это означает, что у вас может быть 2 контроллера в памяти, которые вам не нужны.
- Если вы идете от контроллера
A
к B
в C
и обратно B
то предыдущий контроллер взгляд C
, не A
. Это может быть желаемый результат или нет.
- Система игнорирует все другие контроллеры. Так что, если вы используете один, который не является подклассом
TrackedViewController
вызов будет проигнорирован: A
к B
в UITableViewController
к C
сообщит, что C
был представлен B
, хотя был еще один экран между ними. Опять же, это может быть ожидаемым результатом.
Таким образом, если точка 2 и 3 хорошо для вас, то вы должны решить, только погоду, чтобы зафиксировать точку 1. Вы можете использовать weak
удалить удерживающий на два свойстве, но тогда вы потеряете информацию о предыдущем если контроллер освобожден. Так что другой выбор использовать некоторые идентификаторы:
class TrackedViewController : UIViewController {
static var currentViewControllerID: String?
static var previousViewControllerID: String?
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
TrackedViewController.previousViewControllerID = TrackedViewController.currentViewControllerID
TrackedViewController.currentViewControllerID = self.screenIdentifier
}
var screenIdentifier: String {
return "Default Screen" // TODO: every view controller must override this method and have unique identifier
}
}
Также вы можете заменить строки с некоторым перечислением или что-то. Объединение их с некоторыми связанными значениями могло бы создать довольно мощный инструмент.
вы можете сохранить булевой переменной сказать 'isFromFirst' обнаружить и передать истинное ложным во время навигации –
я не имею навигации в моем приложении я отредактировал вопрос –
Если у вас нет навигации, то как вы перемещаетесь? Проконсультируйтесь с нами и покажите нам фрагмент кода, чтобы помочь вам правильно? –