передача нескольких замыканий в качестве параметров функции в swift - PullRequest
0 голосов
/ 28 июня 2018

Итак, я пытаюсь передать два замыкания в функцию, которая создает подпредставление. Основная часть функции, которая принимает замыкания в качестве аргументов и вызывает их, выглядит следующим образом:

///goButton and cancelButton are class level variables

var goButton = UIButton(type: .system)

var cancelButton = UIButton(type: .system)


func addSubViewWithAction(_ titleString:String, _ button1Text:String, _ button2Text:String, closureYes:@escaping ()->(), closureNo:@escaping ()->()) {

goButton.actionHandle(controlEvents: UIControlEvents.touchUpInside,
                      ForAction:closureYes)

cancelButton.actionHandle(controlEvents: UIControlEvents.touchUpInside,
                          ForAction:closureNo)
}

вот как я пытаюсь это назвать.

addSubViewWithAction("Hide Penguin here?","Yes","Cancel", closureYes: switchPlayers, closureNo: deletePenquin)

Проблема в том, что она вызывает функцию deletePenguin для обеих кнопок и никогда не вызывает функцию switchPlayers.

вот как я добавляю кнопки в основной вид через подпредставление

    //v here is a UIView object
    //Add all buttons and text to subView
    v.addSubview(titleField)
    v.addSubview(goButton)
    v.addSubview(cancelButton)
    v.layer.cornerRadius = 8

    //Add subView to main view
    window.addSubview(v)

1 Ответ

0 голосов
/ 28 июня 2018

Проблема в том, что actionHandle как-то работает статически, поэтому оно перезапишет любое предыдущее назначение самым последним.

Вы можете сделать следующее (здесь не полное кодовое решение, только псевдокод):

  • Подкласс UIButton
  • Добавить переменную экземпляра, которая содержит замыкание для выполнения
  • Добавить функцию экземпляра (помощника), которая действует как цель для вашего события и внутри выполняет замыкание выше
  • Создать функцию, которая принимает замыкание для исключения в качестве параметра. Внутри,
    • Назначьте вашу переменную экземпляра с предоставленным закрытием
    • Позвоните addTarget(_:action:for:) с вашим помощником в качестве цели

Если вы хотите поддерживать разные UIControlEvent s, вам придется немного улучшить эти шаги, возможно, с помощью словаря, который отображает событие на замыкание или около того.

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