简体   繁体   中英

selecting UISegmentedController segment outside of view controller

I have a ViewController with layered container views in it, along with this SegmentedController code:

@IBOutlet weak var dayPicker: UISegmentedControl!

@IBAction func dayPickerControl(sender: UISegmentedControl) {

    switch dayPicker.selectedSegmentIndex {
    case 0:
        monContainer.hidden = false
        tuesContainer.hidden = true
        wedContainer.hidden = true
        thursContainer.hidden = true
        friContainer.hidden = true
        satContainer.hidden = true
        sunContainer.hidden = true
    case 1:
        monContainer.hidden = true
        tuesContainer.hidden = false
        wedContainer.hidden = true
        thursContainer.hidden = true
        friContainer.hidden = true
        satContainer.hidden = true
        sunContainer.hidden = true
    case 2:
        monContainer.hidden = true
        tuesContainer.hidden = true
        wedContainer.hidden = false
        thursContainer.hidden = true
        friContainer.hidden = true
        satContainer.hidden = true
        sunContainer.hidden = true
    case 3:
        monContainer.hidden = true
        tuesContainer.hidden = true
        wedContainer.hidden = true
        thursContainer.hidden = false
        friContainer.hidden = true
        satContainer.hidden = true
        sunContainer.hidden = true
    case 4:
        monContainer.hidden = true
        tuesContainer.hidden = true
        wedContainer.hidden = true
        thursContainer.hidden = true
        friContainer.hidden = false
        satContainer.hidden = true
        sunContainer.hidden = true
    case 5:
        monContainer.hidden = true
        tuesContainer.hidden = true
        wedContainer.hidden = true
        thursContainer.hidden = true
        friContainer.hidden = true
        satContainer.hidden = false
        sunContainer.hidden = true
    case 6:
        monContainer.hidden = true
        tuesContainer.hidden = true
        wedContainer.hidden = true
        thursContainer.hidden = true
        friContainer.hidden = true
        satContainer.hidden = true
        sunContainer.hidden = false
    default:
        break;
    }

How can I select a certain segment from another view controller so that when I return to this View the container that I want is visible and the corresponding segment is selected?

First you need to be saving global state somewhere for any part of your application to access. Even something as simple as a shared object (singleton) or an object tied to UIApplicationDelegate will do fine here.

One option is to use the singleton method. A lot of people don't like to use singletons for various reasons but I think it's an easy illustration of a global value in this case. The point of a singleton is to keep an object around for the lifetime of the application. An alternative would be to tie this state to UIApplicationDelegate .

To implement the singleton (you can put this in its own file if you wish, I called it UserState but you can change that to whatever you want):

private let _UserStateSharedInstance = UserState()

class UserState  {
    class var sharedInstance : UserState {
        return _UserStateSharedInstance
    }
    var selectedDay = 0
}

In this view controller you can retrieve the selected day:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    dayPicker.selectedSegmentIndex = UserState.sharedInstance.selectedDay
}

@IBAction func dayPickerControl(sender: UISegmentedControl) {
    UserState.sharedInstance.selectedDay = sender.selectedSegmentIndex // You probably also want to set this here

    // Do your switching here
}

In your other view controller you can set your selected day:

@IBAction func dayPickerControl(sender: UISegmentedControl) {
    UserState.sharedInstance.selectedDay = sender.selectedSegmentIndex
}

While we're at it, might I suggest an easier way to do this switching?

We might start out by combining each case into a simple logical statement to avoid having to repeat the list over and over again:

@IBAction func dayPickerControl(sender: UISegmentedControl) {

    let segmentIndex = sender.selectedSegmentIndex

    monContainer.hidden = (segmentIndex != 0)
    tuesContainer.hidden = (segmentIndex != 1)
    wedContainer.hidden = (segmentIndex != 2)
    thursContainer.hidden = (segmentIndex != 3)
    friContainer.hidden = (segmentIndex != 4)
    satContainer.hidden = (segmentIndex != 5)
    sunContainer.hidden = (segmentIndex != 6)
}

Now it's becoming more obvious that this is just an array of views that we want to hide/show depending on an index. We might rewrite this with a loop:

var viewsToHide: [UIView]?

override func viewDidLoad() {
    super.viewDidLoad()

    viewsToHide = [monContainer, tuesContainer, wedContainer, thursContainer, friContainer, satContainer, sunContainer]
}

@IBAction func dayPickerControl(sender: UISegmentedControl) {

    let segmentIndex = sender.selectedSegmentIndex

    for (index, view) in enumerate(viewsToHide ?? []) {
        view.hidden = (segmentIndex != index)
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM