2016-09-16 1 views
0

Я использую раскадровку & segue для перехода от «HomeVC» к «MapVC».Я не хочу перезагружать контроллер просмотра

HomeVC -> переход -> MapVC

И поскольку навигации контроллер встроен, MapVC автоматически получают кнопку назад.

Теперь, когда я снова возвращаюсь из HomeVC-> MapVC, MapVC перезагружается. Который я не хочу. Есть ли способ избежать этого программным путем.

ответ

1

Когда вы нажимаете MapVC от HomeVC, новый объект MapVC создается каждый раз. Его не то, что MapVC перезагружается, вместо этого каждый раз создается новый экземпляр.

+0

Итак, что мне делать? –

+0

Вы можете сохранить ссылку на экземпляр MapVC глобально. Поэтому каждый раз, когда вы нажимаете MapVC из HomeVC, вы можете использовать ту же ссылку. – PGDev

+0

Но я загружаю его с помощью segue. –

2

Я не хотел бы использовать SEGUE но IBAction и сделать толчок вручную:

например

  1. крюк вверх UIButton (или любой другой), чтобы вызвать @IBAction func buttonClicked(sender: UIButton!)

  2. сохранить ссылку на mapVC как отдушина: @IBOutlet var mapVC:MyMapViewController! [Примечание: вы можете также инициализировать VC вручную]

  3. осуществить действие для того, чтобы нажать тот же самый mapVC

    @IBAction func buttonClicked(sender: UIButton!) { 
        navigationController.pushViewController(mapVC, animated:true) 
    } 
    

ИМХО самый простой/прагматичный


альтернативная идея: держать SEGUE, но подключить его к пустой ВК. в prepareForSegue добавить mapVC как ребенка destinationViewController в SEGUE в

ИМО это плохо


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

ИМХО это лучше и как ВК предназначены для использования

0

Если вы используете Раскадровка перетекает, новый экземпляр вашего MapVC будет создан каждый раз, когда Segue выполняется. Вот как работает Segue. Чтобы решить эту проблему, вы можете хорошо ссылаться на свой MapVC в HomeVC и вместо этого нажимать. Эти шаги включают удаление Segue в вашем раскадровке и назначение идентификатора раскадровки на вашем MapVC. Вероятно, вы хотите создать @IBAction, чтобы добавить кнопку, чтобы вызвать нажатие. Предположим, вы установили "idMapVC" в качестве идентификатора вашего MapVC в своем раскадровке. У вас получится код:

class HomeVC: UIViewController { 
    var mapVC: MapVC? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     mapVC = storyboard?.instantiateViewController(withIdentifier: "idMapVC") as? MapVC 
    } 

    @IBAction func pushTheMap() { 
     guard let mapVC = self.mapVC 
      else { return } 

     navigationController?.pushViewController(mapVC, animated: true) 
    } 
} 
0

Чего вы на самом деле хотите достичь? Вы не хотите отображать представление MapVC?

Если вы сохранили какое-то состояние в MapVC, которое вы теряете, то вы делаете что-то очень, очень неправильно. VC означает View Controller. Он контролирует представление. Он никогда не должен содержать ваши данные.Поэтому удаление одного контроллера вида и создание нового должно быть абсолютно безболезненным.

+0

Простите меня, если я ошибаюсь, у меня есть Corona Background. Там у нас было две разные функции. 1 CreateScene: который вызывается только при создании сцены в первый раз. 2 ShowScene: со следующего последовательного времени он вызывается только ShowScene, так как он уже создан. –

0

ViewController всегда загружается в stackпервый в последний из поэтому при подключении любого viewController с помощью нажимной SEGUE во-первых, он загружает весь viewController внутри памяти, и когда вы вернетесь к ранее загруженным зрения он не будет загружаться снова так процесс идет так далее.

Здесь atrick, если вы выберете. Вам нужно просто установить ключ NSUserDefault, используя dispatch_once Блок GCD внутри MapVCviewDidLoad метод соответственно и проверьте перед его загрузкой.

Пример:

// MapVC viewController 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    static dispatch_once_t pred; 
     static id shared = nil; 
     dispatch_once(&pred, ^{ 
      // set the key true here 
    });  

    if([[[NSUserDefaults standardUserDefaults] valueForKey:@"yourKey"] isEqualToString:@"true"]){ 
     // code here which you do not wish to execute again and again 
     // Note: set the key false here so this block will not execute again 
    } 

} 

Примечание: установить ключ верно снова где-то еще, если вы хотите, чтобы выполнить этот конкретный код.

Смежные вопросы