Не могу понять, как использовать замыкание в 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
это основной вид.