gpt4 book ai didi

ios - 无法弄清楚如何在 Swift 中使用闭包

转载 作者:行者123 更新时间:2023-11-28 09:16:16 25 4
gpt4 key购买 nike

我正在尝试在我的 iOS Swift 应用程序中使用 ActionSheetStringPicker。我不知道如何使用完成 block 或成功操作。这是我的代码:

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 block 时,每当我尝试访问传入的三个参数以外的任何内容时,我都会收到 EXC_BAD_ACCESS 错误。如果我尝试将 pickerDone 函数用作成功操作,则仅在以下情况下调用它我将函数定义为不带任何参数。

我能找到的所有关于 done block 的例子都只打印出参数的值。我需要一个示例来说明如何将信息从选择器返回到我的 UI。

我试图找出如何捕获变量以供在我的闭包中使用,但我遇到了相同的 EXC_BAD_ACCESS 错误。我 try catch 本地,但这没有用:

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

然后我尝试捕捉 self ,但这也不起作用:

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

最佳答案

我是 ActionSheetPicker 的所有者。我没有尝试使用 touchesBegan 覆盖,但它应该是一样的。

我尝试将您的代码从 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()

}

下面是从完成 block 运行函数的示例:

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()
}

可能是你的origin参数有问题。检查 touch.view 是否为主视图。

关于ios - 无法弄清楚如何在 Swift 中使用闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27517021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com