【问题标题】:Can't figure out how to use closure in Swift不知道如何在 Swift 中使用闭包
【发布时间】:2014-12-17 01:36:57
【问题描述】:

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

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 函数用作成功操作,则仅在以下情况下调用它我将函数定义为不带任何参数。

我可以为 done 块找到的所有示例仅打印出参数的值。我需要一个示例来说明如何将选择器中的信息返回到我的 UI。

我试图弄清楚如何捕获变量以在我的闭包中使用,但我得到了相同的 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
}

【问题讨论】:

    标签: ios swift picker actionsheetpicker


    【解决方案1】:

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

    下面是从 done 块运行函数的示例:

    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 是主视图。

    【讨论】:

    • 我已经可以从 ActionStringDoneBlock 或 done 块中打印,就像您在此处所做的那样。问题是我除了打印什么都做不了。除了传入的变量之外,我无法访问这些函数中的任何变量,因此我无法弄清楚如何将任何信息返回到我的 UI。例如,我可以很好地打印所选索引,但我需要做的是将所选索引的值返回到我的 UILabel。
    • @aranha 与从其他块或回调方法中执行此操作的方式相同。 1)为您的文本字段创建出口myTextField 2)例如用self.myTextField.text = self.arrayWithStrings[selectedIndex]替换println。查看github.com/skywinder/ActionSheetPicker-3.0 中的示例项目,您可以在那里找到此操作的示例。
    • 我有一个标签和一个字符串列表:@IBOutlet weak var attachmentLabel: UILabel! var attachmentsList = [String]() 该列表在其他地方填充。如果我采取这样的行动:let done: ActionStringDoneBlock = {[weak self](picker: ActionSheetStringPicker!, selectedIndex: NSInteger!, selectedValue : AnyObject!) in var index: Int = selectedIndex self?.attachmentLabel.text = self?.attachmentsList[index] } 我会因 EXC_BAD_ACCESS 错误而崩溃。抱歉,我试图很好地格式化它,但我不知道如何让换行符出现。
    • @aranha 最好在 GitHub repository 中打开问题,然后使用格式良好的 cmets 继续我们的讨论。
    • 我在尝试访问“done”块中的变量时遇到了 EXC_BAD_ACCESS 错误的相同问题。你已经有解决这个问题的办法了吗?
    猜你喜欢
    • 2015-10-08
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 2013-08-06
    相关资源
    最近更新 更多