Как передать аргумент методу, не используя селектор Swift? - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть приложение в Swift, которое имеет несколько UISegmentedControls на странице, каждая из которых имеет одну и ту же цель, метод answerClicked. Тем не менее, мне нужен способ передать информацию этому методу, который скажет, КАКОЙ UISegmentedControl был просто нажат.

Я знаю, что аргументы не могут быть переданы через селекторы - есть ли способ получить эту информацию и передать ее методу answerClicked?

class Flowchart{
    //Init segmented controls up here...

    segmentedControl0.addTarget(self, action: #selector(answerClicked), for: .valueChanged)
    segmentedControl1.addTarget(self, action: #selector(answerClicked), for: .valueChanged)
    segmentedControl2.addTarget(self, action: #selector(answerClicked), for: .valueChanged)    

    @objc func answerClicked(){
        //Ideally would have an argument "segmentedControlNumber: Int"
        //How else to tell 0, 1, and 2 apart?
    }
}

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Ответ Vacawama работает отлично, и он хорошо подходит для вопроса, который вы задаете, но я не советую использовать теги. Они хрупкие. Вы должны помнить, чтобы установить теги в вашей раскадровке, и если вы что-то измените, легко забыть сохранить их.

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

var controls: [UISegmentedControl]!

override func viewDidLoad() {
  super.viewDidLoad()
  controls = [segmentedControl1, segmentedControl2, segmentedControl3]
}

@IBAction func answerClicked(_ sender: UISegmentedControl) {
    if let index = controls.index( { where sender === $0 } ) {
       //act on your index
    } else {
       //error case; could not find sender in controls array. (Should not happen)
    }
}

Edit:

Или, если вы хотите использовать оператор switch, вы можете написать его следующим образом:

@IBAction func answerClicked(_ sender: UISegmentedControl) {
  switch sender {
     case segmentedControl1:
        //code for control 1
     case segmentedControl2:
        //code for control 2
     case segmentedControl3:
        //code for control 3
     default: 
        //error case
        //break
   }
}
0 голосов
/ 06 сентября 2018

Установите свойство tag для каждого из ваших UISegmentedControl с, а затем используйте sender, который отправляется в качестве первого аргумента методу изменения значения, чтобы получить tag:

class Flowchart {
    //Init segmented controls up here...

    func setup() {
        segmentedControl1.addTarget(self, action: #selector(answerClicked), for: .valueChanged)
        segmentedControl1.tag = 1

        segmentedControl2.addTarget(self, action: #selector(answerClicked), for: .valueChanged)
        segmentedControl2.tag = 2

        segmentedControl3.addTarget(self, action: #selector(answerClicked), for: .valueChanged)
        segmentedControl3.tag = 3  
    }  

    @objc func answerClicked(_ sender: UISegmentedControl) {
        switch sender.tag {
        case 1:
            // code to handle segmentedControl1
        case 2:
            // code to handle segmentedControl2
        case 3:
            // code to handle segmentedControl3
        default:
            break
        }
    }
}

Примечание. Как отмечается в комментариях @rmaddy, лучше избегать использования тега 0, поскольку все представления по умолчанию получают значение тега 0. Я переименовал ваши сегментированные элементы управления, начиная с 1.

...