当前位置: 首页 > 面试题库 >

将闭包作为目标添加到UIButton

空谦
2023-03-14
问题内容

我有一个通用的控件类,需要根据视图控制器来设置按钮的完成方式。由于setLeftButtonActionWithClosure函数需要将一个闭包作为参数来设置,因此应该将其设置为取消按钮的动作。在Swift中怎么可能因为我们需要将函数名称作为String传递给action:参数。

func setLeftButtonActionWithClosure(completion: () -> Void)
{
self.leftButton.addTarget(<#target: AnyObject?#>, action: <#Selector#>, forControlEvents: <#UIControlEvents#>)
}

问题答案:

注意:就像@EthanHuang一样,“如果您有两个以上的实例,则此解决方案将不起作用。所有操作都将被最后一次分配覆盖。”
在开发时请记住这一点,我会尽快发布另一个解决方案。

如果要将闭包作为目标添加到UIButton,则必须UIButton使用来向类添加函数extension

斯威夫特5

import UIKit    
extension UIButton {
    private func actionHandler(action:(() -> Void)? = nil) {
        struct __ { static var action :(() -> Void)? }
        if action != nil { __.action = action }
        else { __.action?() }
    }   
    @objc private func triggerActionHandler() {
        self.actionHandler()
    }   
    func actionHandler(controlEvents control :UIControl.Event, ForAction action:@escaping () -> Void) {
        self.actionHandler(action: action)
        self.addTarget(self, action: #selector(triggerActionHandler), for: control)
    }
}

较旧

import UIKit

extension UIButton {
    private func actionHandleBlock(action:(() -> Void)? = nil) {
        struct __ {
            static var action :(() -> Void)?
        }
        if action != nil {
            __.action = action
        } else {
            __.action?()
        }
    }

    @objc private func triggerActionHandleBlock() {
        self.actionHandleBlock()
    }

    func actionHandle(controlEvents control :UIControlEvents, ForAction action:() -> Void) {
        self.actionHandleBlock(action)
        self.addTarget(self, action: "triggerActionHandleBlock", forControlEvents: control)
    }
}

并致电:

 let button = UIButton()
 button.actionHandle(controlEvents: .touchUpInside, 
 ForAction:{() -> Void in
     print("Touch")
 })


 类似资料:
  • 我正在开发一个需要安排任务的应用程序,所以我使用AWS Lambda。但是,调度时间是动态的,因为它取决于用户请求,所以不能使用AWS Console进行调度,所以我使用AWS JavascriptSDK来调度它。这是流程: 创建CloudWatch规则(这个成功了,我可以在控制台看到正在创建的规则 为lambda的策略添加权限,以便cloud dwatch事件可以调用它(Lambda函数代码对所

  • 在我开始之前--我看了以下链接,没有一个对我起作用(我的假设是我做错了什么): > https://appmediation.com/how-to-add-local-libraries-to-gradle/ 如何向build.gradle文件添加本地.jar文件依赖项? 在我的Gradle Java项目中使用本地jar作为依赖项 如何向build.gradle.kt文件添加本地.jar文件依赖项

  • 几天前,我为一个java库创建了一个Github包。现在我想将Github包中的依赖项添加到另一个Maven项目中,但出现以下错误: 无法传输工件io。geilehner:StoryBlokJavaSDK:pom:1.0。1从/到github(https://maven.pkg.github.com/geilix10/):为的传输失败https://maven.pkg.github.com/gei

  • 问题内容: 我正在为应用设置身份验证。在发出登录请求后,将发送一个JSON Web令牌作为响应。我可以通过Ajax将其附加到标题。问题是登录后使用window.location.pathname进行重定向时,因为它不是Ajax请求,所以它没有在标头上附加令牌。我该如何解决? 问题答案: 简短的答案是:您不能使用设置HTTP标头。

  • 我想包括JavaDoc for库,但在网站上,他们只提供一个HTML。 我试过了: 下载html并将文件夹添加为jar的JavaDoc, 下载并压缩到index.html,并将下载的文件夹压缩到 添加URL 但有什么好结果。. 我怎样才能做到这一点?