您如何知道提供哪个字符串作为SWIFT函数的选择器?

How do you know which string to provide as a selector for Swift functions?(您如何知道提供哪个字符串作为SWIFT函数的选择器?)
本文介绍了您如何知道提供哪个字符串作为SWIFT函数的选择器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有时,当我在SWIFT中使用选择器(即Selector类型)时,我为targetForAction(_:withSender:)addTarget(_:action:)等方法的action参数提供的字符串文字不会调用或映射到我预期的实际SWIFT函数。

例如,当如下所示的MyResponder实例在响应器链中时,使用字符串showImage:调用targetForAction(_:withSender)时找不到该实例。了解为不同类型的SWIFT函数签名以及必需和/或省略参数标签的选项提供正确的字符串文字的模式是什么?

import UIKit

class MyResponder: UIResponder {

    func showImage( named filename: String ) {
        print( "Loading image..." )
    }
}

class MyViewController: UIViewController {

    @IBAction func buttonTapped( sender: AnyObject? ) {
        if let responder = self.targetForAction( "showImage:", withSender: self ) as? MyResponder {
            responder.showImage(named: "my_image" )
        }
    }
}

推荐答案

在一些尝试、错误和评论者的鼓励下,我终于弄明白了这个模式!

字符串必须遵循从您的Swift函数的签名转换而来的Objective-C语法,这是一个有趣的花边新闻,起初并不明显,但当您考虑像@objc属性这样的用途时,它就完全有意义了。在编写更好的代码样例时,我似乎已经自己弄清楚了映射的模式。

functionName+(With+First)+:+(second)+:

其中,仅当需要参数标签时(即未省略),才需要括号中的内容。记住要将WithFirst大写。

在以下每个示例中,myObject将返回自身作为所提供选择器的目标,表示作为Selector提供的字符串文字实际上映射了它所要使用的SWIFT函数。

import UIKit

class MyObject : UIResponder {
    func someFunction() {}
    func someFunction(param:String) {}
    func someLabeledFunction(param param:String) {}
    func someTwoArgumentFunction(param1:String, param2:String) {}
    func someTwoArgumentNoLabelFunction(param1:String, _ param2:String) {}
    func someHalfLabeledTwoArgumentFunction(param1 param1:String, _ param2:String) {}
    func someCompletelyLabeledTwoArgumentFunction(param1 param1:String, param2:String) {}
}

let myObject = MyObject()
myObject.targetForAction("someFunction", withSender: nil)
myObject.targetForAction("someFunction:", withSender: nil)
myObject.targetForAction("someLabeledFunctionWithParam:", withSender: nil)
myObject.targetForAction("someTwoArgumentFunction:param2:", withSender: nil)
myObject.targetForAction("someTwoArgumentNoLabelFunction::", withSender: nil)
myObject.targetForAction("someHalfLabeledTwoArgumentFunctionWithParam1::", withSender: nil)
myObject.targetForAction("someCompletelyLabeledTwoArgumentFunctionWithParam1:param2:", withSender: nil)

这篇关于您如何知道提供哪个字符串作为SWIFT函数的选择器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Why local notification is not firing for UNCalendarNotificationTrigger(为什么没有为UNCalendarNotificationTrigger触发本地通知)
iOS VoiceOver functionality changes with Bundle Identifier(IOS画外音功能随捆绑包标识符而变化)
tabbar middle tab out of tabbar corner(选项卡栏中间的选项卡角外)
Pushing UIViewController above UITabBar(将UIView控制器推送到UITabBar上方)
Dropbox Files.download does not start when number of files in folder is gt; 1000(当文件夹中的文件数为1000时,Dropbox Files.Download不会启动)
How can I sync two flatList scroll position in react native(如何在本机Reaction中同步两个平面列表滚动位置)