2017-12-09 19 views
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 

問題は何ですか、私はこれを理解できないようです。

答えて

0

これは間違いなくあなたに方法を示すはずです。 どうしたらいいか教えてください。このような

fileprivate func toolbarButton(title: String, closure: Selector) -> UIButton { 
    let button = UIButton(type: .system) 
    button.setTitle(title, for: .normal) 
    button.tintColor = .darkGray 
    button.addTarget(self, action: closure, for: .touchUpInside) 
    return button 
} 

使用:

lazy var nearButton = toolbarButton(title: "Near Me", closure: #selector(handleToolButtonNear)) 
+0

ねえ、ありがとう。私はすでにこの部分を持っています。何が必要なのかは、ボタンと配列の配列を取り込み、すべてのボタンに対して同じインデックスのボタンにクロージャを追加することです –

関連する問題