1

Я создал a Container View в моем приложении. Вид контейнера загружает другие UIViewController, когда пользовательские закладки на UITableviewCell и другие UIViewController загружается внутри контейнера. Я попытался тестирования, вставляя сообщения журнала на другой класс ViewController и выяснили, каждый раз, когда viewDidLoad и ViewDidAppear метод вызывается, в котором говорится, те, класс получает экземпляр каждый раз на вкладке клеток.Как сделать метод viewDidLoad вызова ViewController только один раз?

Но при изучении около зрения контейнера на яблоневых документы https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html

Я нашел UITabBarController также реализует ContainerView и управляет UIViewController в массиве. Я попытался проверки сообщений журнала и обнаружил, что viewDidLoad метод вызывается только один раз, и когда мы посещаем во второй раз на вкладке только viewDidAppear вызывается. Так что мне действительно интересно, что за сценой происходит в этом. Используют ли они UnWind segue (я думаю, нет).

Однако я создал контейнер View Controller с follwing пути следуя этим учебник: https://github.com/codepath/ios_guides/wiki/Container-View-Controllers-Quickstart в

class ViewController: UIViewController { 


    @IBOutlet weak var contentView: UIView! 

    var activeViewController : UIViewController? { 
     didSet{ 
      removeInactiveViewController(oldValue) 
      updateActiveViewController() 
     } 
    } 


    var cellTxtArrs = ["FIRST","SECOND","THIRD"] 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     var tblView : UITableView = UITableView() 
     tblView.frame = CGRectMake(0, 20, 300 ,100) 
     tblView.separatorColor = UIColor.clearColor() 
     tblView.scrollEnabled = false 
     tblView.rowHeight = (30) 
     self.view.addSubview(tblView) 
     tblView.delegate = self 
     tblView.dataSource = self 
     tblView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "myCell") 


    } 



    func removeInactiveViewController(inactiveViewController:UIViewController?){ 


     if let inActiveVC = inactiveViewController{ 

      inActiveVC.willMoveToParentViewController(nil) 

      inActiveVC.view.removeFromSuperview() 

      inActiveVC.removeFromParentViewController() 

     } 


    } 


    func updateActiveViewController(){ 


     if let activeVC = activeViewController{ 

      //not necessary 
      addChildViewController(activeVC) 

      activeVC.view.frame = contentView.bounds 

      contentView.addSubview(activeVC.view) 

      activeVC.didMoveToParentViewController(self) 




     } 


    } 





    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


} 


extension ViewController : UITableViewDataSource , UITableViewDelegate{ 

    //MARK: table view data source methods 
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

     // cell.textLabel?.font = UIFont(name: label.font.fontName, size: 22) 
     var cell : UITableViewCell = tableView.dequeueReusableCellWithIdentifier("myCell") as! UITableViewCell 
     cell.backgroundColor = UIColor(red: 0.000, green: 0.400, blue: 0.404, alpha: 1.00) 
     cell.selectionStyle = UITableViewCellSelectionStyle.None 
     cell.textLabel?.text = self.cellTxtArrs[indexPath.row] 
     cell.textLabel?.textAlignment = NSTextAlignment.Left 
     cell.textLabel?.textColor = UIColor.whiteColor() 

     return cell 

    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

     return self.cellTxtArrs.count 

    } 


    //MARK: - table view delegate methods 

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

     var row = indexPath.row 

     switch row { 

     case 0: 




       let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
       let firstVC = storyboard.instantiateViewControllerWithIdentifier("firstVC") as! FirstViewController 
       activeViewController = firstVC 



     case 1: 

       var storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
       let secondVC = storyboard.instantiateViewControllerWithIdentifier("secondVC") as! SecondViewController 
       activeViewController = secondVC 


     case 2: 


       let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
       let thirdVC = storyboard.instantiateViewControllerWithIdentifier("thirdVC") as! ThirdViewController 
       activeViewController = thirdVC 



     default: 
      println("no index") 


     } 




    } 


} 

ответ

1

Контроллер бара вкладки имеет множество дочерних контроллеров, которые сохраняются при переключении между ними.

В основном то, что вам нужно сделать, это:

  • создать контейнер для хранения дочерних контроллеров (массив)
  • добавить контроллер в массив, если он не существует
  • повторно контроллер от массив, если он существует

Я использую эту процедуру в нескольких местах.

Обратите внимание, что это также отлично работает с наличием навигационных контроллеров в представлении содержимого, но также будет сохраняться стек навигации, который не может быть желательным. Например, если у вас есть 3 вкладки, а 1-я вкладка перемещена на 2-й контроллер просмотра, она останется на втором контроллере представления даже после перехода на 3-ю вкладку и обратно на 1-й.

+0

umm.yeah..that означает, что я должен создавать экземпляр контроллера только один раз ... не нажав на ячейку вправо? –

+0

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

+0

oh..thanks действительно ... еще один вопрос ... у меня будут проблемы позже при создании экземпляра только один раз .... или я должен добавить некоторый логин в метод viewDidAppear для внесения изменений в другой viewContreoller, поскольку viewDidLoad не вызывает ? Как мне управлять изменениями для них? –

1

Кэш неактивных контроллеров представления в массиве после выделения, и вы вызовете их метод viewDidLoad только один раз.

Прямо сейчас viewDidLoad вызывается, потому что вы каждый раз назначаете новый контроллер.

+0

umm..может ли я кэшировать средство viewcontroller ... я должен инициализировать их методом viewDidLoad ??? –

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