2017-07-04 2 views
3

Ich möchte die view einer UINavigationController in einem anderen View-Controller view setzen. Das Problem ist, dass die rechte Leiste auf iOS 10 falsch platziert ist. Auf iOS 8 und 9 sieht es gut aus.Falsche Position von rightBarButtonItem in iOS 10

iOS 8 und 9:

enter image description here

iOS 10:

enter image description here

Hier ist der Code, wie ich die Navigation-Controller hinzufügen:

override func viewDidLoad() { 
    super.viewDidLoad() 

    let viewController = MyViewController() 
    navController = UINavigationController(rootViewController: viewController) 
    navController.willMove(toParentViewController: self) 
    addChildViewController(navController) 
    navController.view.frame = view.bounds 
    view.addSubview(navController.view) 
    navController.didMove(toParentViewController: self) 
} 

In MyViewController

override func viewDidLoad() { 
    super.viewDidLoad() 

    navigationItem.rightBarButtonItem = UIBarButtonItem(
     barButtonSystemItem: .done, 
     target: self, 
     action: #selector(doneButtonPressed) 
    ) 
} 

Auch gibt es keine abgeschnittenen Ansichten (außer der Schaltfläche selbst). Siehe Snapshot von IB Debug anzeigen Hierachy:

enter image description here

Irgendwelche Ideen?

Antwort

2

Ich löste das Problem, indem die viewWillAppear Spedition und viewDidAppear Ereignisse zum Root-View-Controller des Navigationscontrollers.

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    navController.viewControllers.first?.viewWillAppear(animated) 
} 

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 

    navController.viewControllers.first?.viewDidAppear(animated) 
} 
0

Dies geschieht, weil Sie die Subviews im ViewDidLoad und nicht viewDidAppear sind hinzufügen, versuchen dies zu ändern:

override func viewDidLoad() { 
    super.viewDidLoad() 


    let viewController = MyViewController() 
    navController = UINavigationController(rootViewController: viewController) 
    navController.willMove(toParentViewController: self) 
    addChildViewController(navController) 
    navController.view.frame = view.bounds 
    view.addSubview(navController.view) 
    navController.didMove(toParentViewController: self) 
} 

dies:

let viewController = MyViewController() 

    override func viewDidAppear() { 
     super.viewDidAppear() 
    if(self.childViewControllers.contains(viewController) != true){ 
     navController = UINavigationController(rootViewController: viewController) 
     navController.willMove(toParentViewController: self) 
     addChildViewController(navController) 
     navController.view.frame = view.bounds 
     view.addSubview(navController.view) 
     navController.didMove(toParentViewController: self) 

     } 
} 
+0

Ich denke nicht, dass dies der richtige Ansatz ist, da 'viewDidAppear' im Lebenszyklus mehrmals aufgerufen werden kann und' viewDidLoad' nur einmal aufgerufen werden kann. – lukwuerz

+0

Ja, das ist ein anderes Thema, ich werde meinen Code entsprechend bearbeiten :-) – RJiryes

+0

@lufritz hat es funktioniert? – RJiryes

Verwandte Themen