Не могу понять, как использовать замыкание в Swift

Я пытаюсь использовать ActionSheetStringPicker в своем приложении iOS Swift. Я не могу понять, как использовать готовый блок или успешное действие. Вот мой код:

func pickerDone()
{
    println("Here I am!")
}

override func touchesBegan(touches: NSSet, withEvent event: UIEvent)
{
    var selected = 0
    let done: ActionStringDoneBlock = {(picker: ActionSheetStringPicker!, selectedIndex: NSInteger!, selectedValue : AnyObject!) in
        println(selectedIndex)
    }

    var touch = touches.anyObject() as UITouch

    if touch.view is UILabel
    {
        var picker = ActionSheetStringPicker(title: "Select an attachment", rows: attachmentsList, initialSelection: 0, doneBlock: done, cancelBlock: nil, origin: touch.view)
        picker.showActionSheetPicker()
    }
}

Элементом, реагирующим на прикосновение, является UILabel, называемый attachmentLabel, который я хотел бы изменить в зависимости от выбора, сделанного в ActionSheetStringPicker. Однако, когда я попадаю внутрь блока done, я получаю ошибку EXC_BAD_ACCESS всякий раз, когда пытаюсь получить доступ к чему-либо, кроме трех переданных параметров. И если я пытаюсь использовать функцию pickerDone в качестве успешного действия, она вызывается только если Я определяю функцию, чтобы не принимать никаких параметров.

Все примеры, которые я могу найти для готового блока, выводят только значения параметров. Мне нужен пример того, как вернуть информацию из сборщика обратно в мой интерфейс.

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

var selected = 0
let done: ActionStringDoneBlock = {(picker: ActionSheetStringPicker!, selectedIndex: NSInteger!, selectedValue : AnyObject!) in
    selected = selectedIndex
}

Тогда я попытался запечатлеть себя, но это тоже не сработало:

let done: ActionStringDoneBlock = {[weak self](picker: ActionSheetStringPicker!, selectedIndex: NSInteger!, selectedValue : AnyObject!) in
    self?.attachmentLabel.text = self?.attachmentsList[selectedIndex]
    return
}

1 ответ

Я владелец ActionSheetPicker. Я не пробовал работать с touch-Bean overriding, но так должно быть.

Я пытаюсь обернуть твой код из touchesBegan в @IBAction и это работает (печатает индекс после того, как сделано нажато):

@IBAction func doneBlockInvokeByDoneClicked(sender: UIButton) {
        var selected = 0
        let done: ActionStringDoneBlock = {(picker: ActionSheetStringPicker!, selectedIndex: NSInteger!, selectedValue : AnyObject!) in
            println(selectedIndex)
        }

        var picker = ActionSheetStringPicker(title: "Select an attachment", rows: ["One", "Two", "A lot"], initialSelection: 0, doneBlock: done, cancelBlock: nil, origin: sender.superview!.superview)

        picker.showActionSheetPicker()

    }

А вот пример для запуска вашей функции из готового блока:

func pickerDone()
{
    println("Here I am!")
}

@IBAction func functionInvokeByDoneCicked(sender: UIButton) {
    var picker = ActionSheetStringPicker(title: "title", rows: ["1","2"], initialSelection: 0, target: self, successAction: "pickerDone", cancelAction: nil, origin: sender.superview!.superview)

    picker.showActionSheetPicker()
}

Возможно, есть проблема с вашим параметром источника. Проверь это touch.view это основной вид.

Другие вопросы по тегам