wake-up-neo.com

Swift - Wie lassen sich zwei View-Controller in einer Container-Ansicht verknüpfen und mithilfe der segmentierten Steuerung zwischen ihnen wechseln?

Im Moment habe ich einen View-Controller, der 1 segmentierte Kontrolle und 2 UI-Views enthält. Aber ich denke, es ist zu kompliziert, die Ansicht der Benutzeroberfläche für eine spätere Bearbeitung zu aktualisieren. Ich verwende eine versteckte Methode.

import UIKit

class PopularHistoryViewController: UIViewController {


    @IBOutlet weak var segmentedControl: UISegmentedControl!
    @IBOutlet weak var popularView: UIView!
    @IBOutlet weak var historyView: UIView!

    @IBAction func indexChanged(sender: UISegmentedControl) {
        switch segmentedControl.selectedSegmentIndex
        {
        case 0:
            NSLog("Popular selected")
            //show popular view
            popularView.hidden = false
            historyView.hidden = true
        case 1:
            NSLog("History selected")
            //show history view
            popularView.hidden = true
            historyView.hidden = false
        default:
            break; 
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

}

Was ich möchte, ist 1 Containeransicht, die 2 Controller-Ansichten enthält, sodass ich sie mithilfe der segmentierten Steuerung wechseln kann.

enter image description here

Bitte beraten.

13
Mohammad Nurdin

Der andere Ansatz besteht darin, nur einen untergeordneten Ansichtscontroller gleichzeitig im Speicher zu haben. Wenn Sie den ausgewählten Wert im segmentierten Steuerelement ändern, laden Sie den neuen untergeordneten Viewcontroller, wechseln Sie von einem untergeordneten Viewcontroller zum nächsten, und entfernen Sie dann den alter untergeordneter Ansichtscontroller:

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 wird davon ausgegangen, dass der erste untergeordnete View-Controller bereits in der View vorhanden ist (dies ist bei Verwendung des Steuerelements "Container-View" im Interface Builder problemlos möglich) und dem standardmäßig ausgewählten Wert für die UISegmentedControl-Übereinstimmungen. Für diese beiden untergeordneten Szenen müssen Sie auch Storyboard-Bezeichner haben.

Für die Swift-2-Wiedergabe siehe vorherige Überarbeitung dieser Antwort .

28
Rob

Ich habe vor einiger Zeit ausgiebig versucht, dies zu tun. Aus irgendeinem Grund funktionierten die verborgenen Eigenschaften für mich nicht und die Containeransicht scheint sich nicht zu aktualisieren. Ich weiß, dass dies nicht die ideale Lösung ist, aber am Ende habe ich zwei Containeransichten erstellt und mit dem segmentierten Steuerelement die Alphas der Containeransichten geändert. Wieder nicht ideal, aber es hat gut funktioniert.

1
scott