2017-05-08 13 views
1

Ich habe eine viewController mit segmentedControl. Ich habe eine VCA und VCB, die in der segmentedControl sind. Wenn ich auf das zweite Segment klicke, erscheint VCB. Jetzt dränge ich einen anderen ViewController von VCB. Aber wenn von diesem ViewController zurückgekommen wird, wird viewDidAppear von VCA aufgerufen. Was mir fremd ist. Weil der Benutzer auf dem VCB ist, warum also die viewWillAppear und viewDidAppear von VCA aufgerufen werden? Hier ist ein Diagramm, mehr zu erklärenviewDidAppear heißt Strangley

enter image description here

Dies ist, wie ich bin Viewcontrollers Zugabe

segmentedControl
func switchToViewController(viewController: UIViewController, selectedIndex: Int) { 

    viewController.removeFromParentViewController() 
    viewController.view.removeFromSuperview() 

    addChildViewController(viewController) 
    viewController.view.translatesAutoresizingMaskIntoConstraints = false 
    self.view.addSubview(viewController.view) 

    // Setting constraints of the container view 
    NSLayoutConstraint.activate([ 
    viewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0), 
     viewController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0), 
     viewController.view.topAnchor.constraint(equalTo: view.topAnchor, constant: 50), 
     viewController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0) 
     ]) 

    viewController.didMove(toParentViewController: self) 
} 

Ich bin nur nicht in der Lage, das Verhalten zu verstehen. Also bitte führe mich.

+0

ist viewcontroller mit segmentierter Steuerung und VCA gleich? – Priyal

+0

nein Sie sind nicht gleich. viewController mit segmentiertem Control ist ein anderes VC lasst es VCSegmentedControl nennen –

+0

Warum entfernst du 'viewController' und fügst dir' viewController' hinzu? –

Antwort

2

Du nie den aktuellen View-Controller und seine Ansicht aus der Hierarchie zu entfernen ...

Sie müssen den Überblick behalten, von denen VC/Ansicht gerade angezeigt wird - vielleicht mit einer currentVC Variable und Ihre Funktion sollte wie folgt aussehen:

func switchToViewController(viewController: UIViewController, selectedIndex: Int) { 

    // remove current ViewController from VC hierarchy 
    currentVC.removeFromParentViewController() 

    // remove current VC.View from View hierarchy 
    currentVC.view.removeFromSuperview() 

    // the "incoming" ViewController becomes the "current" ViewController 
    currentVC = viewController 

    addChildViewController(viewController) 
    viewController.view.translatesAutoresizingMaskIntoConstraints = false 
    self.view.addSubview(viewController.view) 

    // Setting constraints of the container view 
    NSLayoutConstraint.activate([ 
    viewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0), 
     viewController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0), 
     viewController.view.topAnchor.constraint(equalTo: view.topAnchor, constant: 50), 
     viewController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0) 
     ]) 

    viewController.didMove(toParentViewController: self) 
} 
+0

Vielen Dank für Ihre Erklärung: -) –

1

Hier gehen Sie, können Sie dies erreichen, indem containerView verwenden. ContainerView ist eine normale UIView Unterklasse. Ihre Benutzeroberfläche wird so sein. Sie werden eine baseViewController haben, wo Sie segmentControl und containerView Ansicht in baseViewController haben werden.

enter image description here

Angenommen, Sie zwei View-Controller nämlich viewController1 und viewController2 haben. Sie können diese viewControllers als childViewController zu diesem containerView wie unten hinzufügen.

import UIKit 

class BaseViewController: UIViewController { 

    @IBOutlet weak var typeSegment: UISegmentedControl! 
    @IBOutlet weak var containerView: UIView! 

    var viewController1: UIViewController? 
    var viewController2: UIViewController? 


    // MARK: - Action method. 

    @IBAction func segmentIndexChanged(_ sender: Any) { 

     let selectedIndex = typeSegment.selectedSegmentIndex 

     switch selectedIndex { 
     case 0: 
      addVC1() 
     case 1: 
      addVC2() 
     default: 
      break 
     } 

    } 

func rectForChildVC() -> CGRect { 

    let rect = CGRect(x: containerView.frame.origin.x , y: containerView.frame.origin.y, width: containerView.frame.size.width, height: containerView.frame.size.height) 
    return rect 

} 

func addVC1() { 

    removeVC2() 
    let storyboard = UIStoryboard(name: "StoryboardName", bundle: nil) 
    viewController1 = storyboard.instantiateViewController(withIdentifier: "Viewcontroller1Identifier") // Create you first view controller instance here. 
    viewController1?.view.frame = rectForChildVC() 
    addChildViewController(viewController1!) 
    view.addSubview((viewController1?.view)!) 
    viewController1?.didMove(toParentViewController: self) 
    view.layoutIfNeeded() 

} 

func addVC2() { 

    removeVC1() 
    let storyboard = UIStoryboard(name: "StoryboardName", bundle: nil) 
    viewController2 = storyboard.instantiateViewController(withIdentifier: "Viewcontroller2Identifier") // Create you second view controller instance here. 
    viewController2?.view.frame = rectForChildVC() 
    addChildViewController(viewController2!) 
    view.addSubview((viewController2?.view)!) 
    viewController2?.didMove(toParentViewController: self) 
    view.layoutIfNeeded() 

} 

func removeVC1() { // Remove first view controller. 

    if let viewController = viewController1 { 
     viewController.didMove(toParentViewController: nil) 
     viewController.view.removeFromSuperview() 
     viewController.removeFromParentViewController() 
    } 

} 

func removeVC2() { // Remove second view controller 

    if let viewController = viewController2 { 
     viewController.didMove(toParentViewController: nil) 
     viewController.view.removeFromSuperview() 
     viewController.removeFromParentViewController() 
    } 

} 

} 

Danke.

+0

Vielen Dank für Ihre Lösung, aber ich möchte nicht meine Implementierung ändern ... :) –

Verwandte Themen