Взаимоисключающие радиокнопки для MacOS в Swift - PullRequest
0 голосов
/ 18 октября 2019

У меня есть пять радиокнопок, и выбор одной из них должен отменить выбор других.

У меня было много вопросов о радиокнопках в Swift, но они либо для iOS, либо дляустаревшие версии Swift, потому что XCode не предлагает мне такие опции, как «.isSelected». У меня есть «.isEnabled», но здесь явно имеет значение семантика, потому что «enabled» - это не то же самое, что «selected», и это показывает.

Запись моего кода в виде серии «if-else»операторы в следующем формате:

func disableUnselectedButtons() {
    if Button2.isEnabled == true {
        Button1.isEnabled = false
        Button3.isEnabled = false
        Button4.isEnabled = false
        Button5.isEnabled = false
    }
}

приводит к ситуации, когда я могу выбрать все пять кнопок и не могу ОТКЛЮЧИТЬ ни одну из них после выбора другой. Я также попробовал варианты .on / .off и не могу найти подходящую для этой ситуации.

Также неуклюже писать метод с пятью операторами if-else по этим строкам,Итак, вот что.

Как лучше всего реализовать это?

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Другой способ подойти к этому - представить кнопки в виде набора, а затем их легко перебирать и настраивать их состояние. Приведенный ниже код фактически позволяет разрешить множественный выбор для поддержки сценария, который хочет «выбрать три из шести вариантов».

let allButtons = Set(1...5). //or however many you want

func selectActiveButtons(_ activeButtons: Set<Int>, from allButtons: Set<Int>){
   let inactive = allButtons.subtracting(activeButtons)
   setButtonState(forButtons: inactive, isSelected: false)
   setButtonState(forButtons: activeButtons, isSelected: true)
}

func setButtonState(forButtons buttons: Set<Int>, isSelected: Bool) {
   buttons.forEach{
      //remove below line and replace with code to update buttons in UI
      print("Button \($0):  \(isSelected ? "Selected" : "Unselected")")
   }
}

// select buttons 1 & 3.  
//If wanting a "classic" radio button group just use one value in the arrayLiteral.
selectActiveButtons(Set(arrayLiteral: 1,3), from: allButtons)
0 голосов
/ 18 октября 2019

Если ваши радиокнопки имеют одинаковое суперпредставление и одинаковое действие, они должны работать как положено.

Чтобы установить одно и то же действие для каждой из ваших радиокнопок, вы можете выполнить одно из следующих действий:

Если вы используете раскадровки, откройте раскадровку и связанный файл быстрого просмотра NSViewController. Перетащите вашу первую радио-кнопку в файл swift, удерживая клавишу Ctrl. Затем сделайте то же самое для каждой из других переключателей, убедившись, что вы перетаскиваете на функцию, созданную с помощью первого Ctrl-перетаскивания.

Если вы создаете переключатели в коде, тогда установите параметр действия в init для каждого переключателя одинаковым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...