2015-01-25 2 views
1

У меня есть ViewController со слоистым видом контейнера в нем, наряду с этим SegmentedController кодом:выбор сегмента UISegmentedController вне поля зрения контроллера

@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; 
    } 

Как я могу выбрать определенный сегмент от другого контроллера представления, так что, когда я вернусь к этому Просмотр видимого контейнера является видимым и выбран соответствующий сегмент?

ответ

0

Прежде всего вам нужно сохранить глобальное состояние где-либо для доступа к любой части вашего приложения. Здесь все будет так просто, как общий объект (singleton) или объект, привязанный к UIApplicationDelegate.

Один из вариантов заключается в использовании метода одиночной кишки. Многие люди не любят использовать синглтоны по разным причинам, но я думаю, что это простая иллюстрация глобальной ценности в этом случае. Точка синглтона - поддерживать объект в течение всего жизненного цикла приложения. Альтернативой было бы привязать это состояние к UIApplicationDelegate.

Для реализации синглтон (вы можете поместить это в отдельный файл, если вы хотите, я назвал его UserState, но вы можете изменить это все, что вы хотите):

private let _UserStateSharedInstance = UserState() 

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

С этой точки зрения контроллера вы можете получить выбранный день:

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 
} 

В вашем другом контроллере зрения вы можете установить выбранный день:

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

Пока мы находимся в этом вопросе, могу ли я предложить более простой способ сделать это переключение?

Мы могли бы начать путем объединения каждого случая в простое логическое заявление, чтобы избежать необходимости повторять список снова и снова:

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

Теперь это становится все более очевидным, что это просто массивом взглядов, мы хотим скрыть/показать в зависимости от индекса. Мы можем переписать это с помощью цикла:

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

Этот вид работы. Я говорю по следующим причинам: 1) UserState.sharedInstance(). SelectedDay создает ошибку, но если я удалю(), ошибка будет исправлена. Нет, biggie. 2) Теперь выбран правильный сегмент, но правильный вид не отображается. например, если я хочу, чтобы выбранный сегмент Wed отображался, и соответствующее видное изображение Wed было видимым, сегмент отображается как выбранный, но представление не отображается. Если я затем нажму другой сегмент, а затем вернусь назад, он покажет правильный вид, но он не будет загружаться таким образом. – Colin

+0

PS - попробовал это в обоих направлениях: так, как раньше, и так, как вы предложили - 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) – Colin

+0

К сожалению о дополнительные parens, я скопировал этот синглтон-код откуда-то и не понял, что они используют var вместо метода. Вам нужно добавить 'dayPicker.selectedSegmentIndex = UserState.sharedInstance.selectedDay' to 'viewDidLoad' или' viewWillAppear' в любом контроллере вида, который имеет сегментированный элемент управления для правильного заполнения. Думаю, вы просто добавили его в контроллер просмотра, с которого вы возвращались. – bjtitus

Смежные вопросы