0
ボタンの配列とクロージャの配列をとる関数を作成する必要があります。最後に、配列からアクションを各ボタンにアタッチし、通知の各ボタンを設定することを目指しています。ここに私の機能があります:関数のクロージャ配列パラメータ
func makeButtons(buttons: [UIButton], withActions actions: [() -> Void]){
var bottomAnchor: NSLayoutYAxisAnchor?
bottomAnchor = notificationView.bottomAnchor
buttons.forEach({ (button) in
button.actionHandle(controlEvent: .touchUpInside, action: actions[buttons.index(of: button)!])
notificationView.addSubview(button)
button.bottomAnchor.constraint(equalTo: bottomAnchor!, constant: -20).isActive = true
button.rightAnchor.constraint(equalTo: notificationView.rightAnchor, constant: -20).isActive = true
button.leftAnchor.constraint(equalTo: notificationView.leftAnchor, constant: 20).isActive = true
button.heightAnchor.constraint(equalToConstant: 40).isActive = true
bottomAnchor = button.topAnchor
})
}
私が実際にactionHandle()を使用してUIButtonターゲットのクロージャを追加できるように拡張を使用しています。私はスタックからそれを得た。ここではそれだ:
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(controlEvent control: UIControlEvents, action:@escaping() -> Void) {
self.actionHandleBlock(action: action)
self.addTarget(self, action: #selector(triggerActionHandleBlock), for: control)
}
}
また、ここで私はメイクのボタン機能を使用しています方法は次のとおりです。
func setButtonsWithAction(){
let button1 = UIButton()
let button2 = UIButton()
addButtons(buttons: [button1, button2], withActions: [self.sayHi, self.sayGoodbye])
}
func sayHi(){
print("Hi there")
}
func sayGoodbye(){
print("Goodbye")
}
すべては、私が欲しいのと同様に、[OK]を設定します。しかし、私が直面している問題は、どのボタンをクリックしても、クロージャ配列から最後の機能を実行することです。この場合、どのボタンをクリックしても「さようなら」が印刷されます。私は必要なもの は次のとおりです。
click button1 -> print Hi
click button2 -> print Goodbye
問題は何ですか、私はこれを理解できないようです。
ねえ、ありがとう。私はすでにこの部分を持っています。何が必要なのかは、ボタンと配列の配列を取り込み、すべてのボタンに対して同じインデックスのボタンにクロージャを追加することです –