2015-01-17 7 views
10

Jetzt habe ich einen View-Controller, der 1 segmentierte Steuerung und 2 UI-Ansichten enthält. Aber ich denke, es ist zu kompliziert, um die UI-Ansicht für die Erweiterung für zukünftige Bearbeitung zu aktualisieren. Ich verwende versteckte Methode.Swift - Wie verbindet man zwei View-Controller in einer Container-Ansicht und wechselt zwischen diesen mit segmentierter Steuerung?

Was ich will, ist 1 Containeransicht, die 2 Controller-Ansichten enthalten, so dass ich sie mit segmentierter Steuerung wechseln kann.

enter image description here

Bitte Beratung.

+0

Sie eigentlich gar nicht sagen, was das Problem ist, Ihren Code zwei Ansichten zeigt – Wain

+0

, was ich will ist, kann ich einen Link zwei View-Controller in der Containeransicht. –

+1

Sehen Sie sich einen Tab-Controller an - er tut "out of the box", obwohl er ein anderes Aussehen hat. – Paulw11

Antwort

0

Ich habe ausgiebig versucht, dies vor einer Weile zu tun. Aus irgendeinem Grund würden die versteckten Eigenschaften für mich nicht funktionieren, und die Containeransicht scheint nicht zu aktualisieren. Ich weiß, dass es nicht die ideale Lösung ist, aber ich habe am Ende zwei Containeransichten erstellt und mithilfe des segmentierten Steuerelements die Alphas der Containeransichten geändert. Wiederum nicht ideal, aber es hat gut funktioniert.

26

Der andere Ansatz besteht darin, nur einen Kind-Controller gleichzeitig im Speicher zu haben, und dann nach dem Ändern des ausgewählten Werts im segmentierten Steuerelement den neuen Kind-View-Controller zu laden und zwischen einem Kind-View-Controller zum nächsten zu wechseln. und dann die alten Kind-view-Controller entfernen:

let viewControllerIdentifiers = ["first", "second"] // storyboard identifiers for the child view controllers 

@IBAction func didChangeValue(sender: UISegmentedControl) { 
    let newController = storyboard!.instantiateViewController(withIdentifier: viewControllerIdentifiers[sender.selectedSegmentIndex]) 
    let oldController = childViewControllers.last! 

    oldController.willMove(toParentViewController: nil) 
    addChildViewController(newController) 
    newController.view.frame = oldController.view.frame 

    transition(from: oldController, to: newController, duration: 0.25, options: .transitionCrossDissolve, animations: { 
     // nothing needed here 
    }, completion: { _ -> Void in 
     oldController.removeFromParentViewController() 
     newController.didMove(toParentViewController: self) 
    }) 
} 

Offensichtlich setzt dies voraus, dass Sie bereits die ersten Kind-view-Controller bereits auf der Ansicht bekamen (leicht getan, wenn Sie die „Container Ansicht“ Steuerung im Interface Builder verwenden) und der standardmäßig ausgewählte Wert für die UISegmentedControl übereinstimmt. Sie müssen auch Storyboard-IDs für diese beiden untergeordneten Szenen haben.

Für Swift 2-Wiedergabe siehe previous revision of this answer.

+1

Sie können auch beide View-Controller im Speicher halten, indem Sie sie in Eigenschaften in 'viewDidLoad' oder instanziieren ähnlich - dann können Sie zwischen ihnen mit Zustand beibehalten, oder sogar Lazy-Load auf den ersten Schalter wechseln, wie 'UITabBarController' tut – Paulw11

+1

einverstanden. Wenn Dato das tut, würde ich definitiv den Ansatz der Lazy Load empfehlen. – Rob

+0

Ich habe fatalen Fehler: unerwartet gefunden, Null beim Auspacken ein optionaler Wert –

-1

Import UIKit

Klasse ContactsView: UIViewController {

@IBOutlet weak var segmentedControl: UISegmentedControl! 
@IBOutlet weak var privateView: UIView! 
@IBOutlet weak var publicView: UIView! 

@IBAction func segmentChanged(sender: UISegmentedControl) { 
    switch segmentedControl.selectedSegmentIndex 
    { 
    case 0: 
     privateView.hidden = false 
     publicView.hidden = true 
    case 1: 
     privateView..hidden = true 
     publicView.hidden = false 
    default: 
     break; 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 


} 

}

Verwandte Themen