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.