ios - 如何在自定义 UIToolbar 类初始化的闭包中添加 UIButton 操作?

标签 ios uibutton closures

我有一个带有两个 UIBarButtonItem 的自定义 UIToolbar 类。我知道我可以为 UIBarButtonItem 项目创建自定义委托(delegate)操作。但是如何在自定义 UIToolbar 类初始化中将闭包用作 UIBarButtonItem 操作?

class KeyboardToolBar: UIToolbar
{
    let done = UIButton.init()

    init() {
        super.init(frame: .zero)
        self.backgroundColor = UIColor.gray
        self.sizeToFit()
        let flexBarBtn = UIBarButtonItem.init(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
        done.frame = CGRect(x: 0, y: 0, width: 50, height: 44)
        done.setTitle("Done", for: .normal)
        done.setTitleColor(.black, for: .normal)
        let doneBarBtn:UIBarButtonItem! = UIBarButtonItem.init(customView: done)
        self.items = [flexBarBtn,doneBarBtn]
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

在 View Controller 中

  super.viewDidLoad()

    txt.keyboardType = .numberPad
    txt.inputAccessoryView = KeyboardToolBar()
    // How can I use some thing like this
    // txt.inputAccessoryView = KeyboardToolBar(doneBtnAction: { 
    // print("done button pressed")
    // })
}

最佳答案

给你...

class KeyboardToolBar: UIToolbar {
    let done = UIButton.init()
    var doneBtnAction:((Void) -> Void)?

    convenience init(_ doneBtnAction: @escaping (Void) -> Void) {
        self.init()
        self.doneBtnAction = doneBtnAction
    }

    private init() {
        super.init(frame: .zero)
        self.backgroundColor = UIColor.gray
        self.sizeToFit()
        let flexBarBtn = UIBarButtonItem.init(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
        done.frame = CGRect(x: 0, y: 0, width: 50, height: 44)
        done.setTitle("Done", for: .normal)
        done.setTitleColor(.black, for: .normal)
        done.addTarget(self, action: #selector(callbackDoneButton(_:)), for: .touchUpInside)
        let doneBarBtn:UIBarButtonItem! = UIBarButtonItem.init(customView: done)
        self.items = [flexBarBtn,doneBarBtn]
    }

    func callbackDoneButton(_ id:Any) -> Void {
        if self.doneBtnAction != nil {
            self.doneBtnAction!()
        }
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

在 View Controller 中

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view, typically from a nib.
    txt.keyboardType = .numberPad
    txt.inputAccessoryView = KeyboardToolBar.init( {
        (Void) -> Void in
        print("done");
    })
}

关于ios - 如何在自定义 UIToolbar 类初始化的闭包中添加 UIButton 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44005561/

相关文章:

iphone - 将按钮添加到 UITableViewCell

java - Scala 闭包和 Java 8 闭包之间的兼容性

javascript - 使用绑定(bind)、调用和应用方法设置超时

iphone - 恢复到非 iPad 应用程序

ios - Swift - 如何从照片库中获取最后拍摄的 3 张照片?

ios - 归档时从嵌入式 Cocoa Touch 框架中删除 i386 和 x86_64

javascript - "closure"在 JavaScript 中到底指的是什么?

ios - 在 watchkit 中接收本地通知

ios - UIBarButtonItem 图像的颜色/不透明度

ios - 如何使用 Swift 3 在本地化条件下更改按钮字体大小