Swift - How to link two view controllers into one container view and switch between them using segmented control?

后端 未结 3 1467
情深已故
情深已故 2020-12-01 08:18

I got one view controller that contain 1 segmented control and 2 UI views. But I think it\'s too complicated to update the UI view for enhancement for future editing. I\'m u

相关标签:
3条回答
  • 2020-12-01 09:05

    The other approach is to only have one child view controller in memory at one time, and then upon changing the selected value in the segmented control, load the new child view controller, transition between one child view controller to the next, and then remove the old child view controller:

    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)
        })
    }
    

    Obviously, this assumes that you've already got the first child view controller already on the view (easily done if you use the "container view" control in Interface Builder) and the default selected value for the UISegmentedControl matches. You also have to have storyboard identifiers for these two child scenes.

    For Swift 2 rendition, see previous revision of this answer.

    0 讨论(0)
  • 2020-12-01 09:06

    I tried extensively to do this a while ago. For some reason the hidden properties wouldn't work for me, and the container view doesn't seem to update. I know it's not the ideal solution, but I ended up creating two container views and using the segmented control to change the alphas of the container views. Again, not ideal, but it worked nicely.

    0 讨论(0)
  • 2020-12-01 09:09
    import UIKit
    
    class 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()   
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题