Подтвердить что ты не робот

Автоматическая установка приемника действий в Swift

Я видел несколько примеров кодов, которые назначают одно и то же событие OnClick всем кнопкам на Android (даже если они выполняют совершенно разные действия). Как это сделать с помощью Swift

Пример Android:

@Override 
public void onCreate(Bundle savedInstanceState) {
        button1.setOnClickListener(onClickListener);
        button2.setOnClickListener(onClickListener);
        button3.setOnClickListener(onClickListener);
} 

private OnClickListener onClickListener = new OnClickListener() {
     @Override 
     public void onClick(View v) {
         switch(v.getId()){
             case R.id.button1:
                  //DO something 
             break; 
             case R.id.button2:
                  //DO something 
             break; 
             case R.id.button3:
                  //DO something 
             break; 
         } 

   } 
}; 

Примечание. Я не хочу создавать кнопку программно.

4b9b3361

Ответ 1

В iOS вы не устанавливаете прослушиватель; вы добавляете цель (объект) и действие (подпись метода, "селектор" на языке iOS) на ваш UIControl (который UIButton является подклассом):

button1.addTarget(self, action: "buttonClicked:", for: .touchUpInside)
button2.addTarget(self, action: "buttonClicked:", for: .touchUpInside)
button3.addTarget(self, action: "buttonClicked:", for: .touchUpInside)

Первым параметром является целевой объект, в данном случае self. Действие - это селектор (подпись метода), и есть в основном два варианта (подробнее об этом позже). Элемент управления бит, специфичный для UIControl - .TouchUpInside, обычно используется для нажатия кнопки.

Теперь действие. Это метод (это ваш выбор) одного из следующих форматов:

func buttonClicked()
func buttonClicked(_ sender: AnyObject?)

Для использования первого используйте "buttonClicked", для второго (который вы хотите здесь) используйте "buttonClicked:" (с завершающим двоеточием). sender будет источником события, другими словами, вашей кнопкой.

func buttonClicked(_ sender: AnyObject?) {
  if sender === button1 {
    // do something
  } else if sender === button2 {
    // do something
  } else if sender === button3 {
    // do something
  }
}

(это предполагает, что button1, button2 и button3 являются переменными экземпляра).

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

func button1Clicked() {
  // do something
}

func button2Clicked() {
  // do something
}

func button3Clicked() {
  // do something
}

Здесь я даже не использую аргумент sender, потому что мне это не нужно.

P.S.: Вместо того, чтобы добавлять цели и действия программно, вы можете сделать это в своем файле раскадровки или файла. Чтобы разоблачить действия, которые вы помещаете IBAction перед вашей функцией, например:

@IBAction func button1Clicked() {
  // do something
}

Ответ 2

Swift 4. *

button.addTarget(self, action: #selector(didButtonClick), for: .touchUpInside)

И кнопка запускает эту функцию:

@objc func didButtonClick(_ sender: UIButton) {
    // your code goes here
}

Ответ 3

У меня недостаточно репутации, чтобы писать комментарии, поэтому я просто отвечу на вопрос пользователя25 здесь.

Скриншот оригинального вопроса

Чтобы проверить, какая кнопка была нажата, вы можете назначить уникальный номер Int для вашего свойства тега кнопки. В моем случае я назначил номер раздела tableView.

Swift 5. *

func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    let footer = tableView.dequeueReusableHeaderFooterView(withIdentifier:
        "myFooter") as! MyFooter
    footer.saveBtn.tag = section  // there is a saveBtn: UIButton in MyFooter, assign section number to saveBtn
    footer.saveBtn.addTarget(self, action: #selector(saveBtnPressed), for: .touchUpInside)

    return view
}

Затем в методе обработчика saveBtnPressed вы можете переключать значение тега и делать разные вещи.

@objc func saveBtnPressed(_ sender: UIButton) {
    switch sender.tag {
    case 0:
        print("Do this...")
    case 1:
        print("Do that...")
    default:
        break
    }
}