2017-02-22 52 views
0

Я хочу знать, как это сделать:Detect, из чего Page я пришел к текущей странице

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

Я искал здесь свой ответ, но все подобные вопросы задавали о навигации !!! Важно, что у меня нет навигации в моем приложении!

+0

вы можете сохранить булевой переменной сказать 'isFromFirst' обнаружить и передать истинное ложным во время навигации –

+0

я не имею навигации в моем приложении я отредактировал вопрос –

+1

Если у вас нет навигации, то как вы перемещаетесь? Проконсультируйтесь с нами и покажите нам фрагмент кода, чтобы помочь вам правильно? –

ответ

0

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

Если вы делаете это только между подклассами 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 
} 

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

  1. Самая большая проблема, с которой вы можете столкнуться, заключается в том, что предыдущий контроллер сохраняется вместе с контроллером текущего вида. Это означает, что у вас может быть 2 контроллера в памяти, которые вам не нужны.
  2. Если вы идете от контроллера A к B в C и обратно B то предыдущий контроллер взгляд C, не A. Это может быть желаемый результат или нет.
  3. Система игнорирует все другие контроллеры. Так что, если вы используете один, который не является подклассом 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 
    } 

} 

Также вы можете заменить строки с некоторым перечислением или что-то. Объединение их с некоторыми связанными значениями могло бы создать довольно мощный инструмент.

+0

не работает! –

+0

Я тестировал его, и он работает. Код не компилируется, как написано на жестком. Позвольте мне исправить это ... –

+0

Я просто хочу использовать эту функцию (если на предыдущей странице есть, например, myView Controller {print ("OK")} –

0

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

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

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:segue_VC1]) { 
     CustomViewController1* destinationVC = segue.destinationViewController; 
     destinationVC.fromSegue = @"I AM VC 1"; 
    } 
    if ([segue.identifier isEqualToString:segue_VC2]) { 
     CustomViewController2* destinationVC = segue.destinationViewController; 
     destinationVC.fromSegue = @"I AM VC 2"; 
    } 
} 

Более важная вещь, вы должны знать, что вы можете получить доступ к атрибуту из контроллера вида назначения вы будете обращаться с Segue.

Я знаю, что это в Obj C, но реализация по-прежнему остается прежней.

Так что, когда вы перемещаетесь с ViewController на другой, вы можете установить атрибут destinationViewController.

Затем, когда вы находитесь в контроллере представления вы хотели навигации вы можете проверить:

if ([_fromSegue isEqualToString: "I AM VC 1"]) 
    // do specific stuff when you come from VC 1 
else if ([_fromSegue isEqualToString: "I AM VC 2"]) 
    // do specific stuff when you come from VC 2 
else 
    // other case 
+0

, к сожалению, не работает :( –