2017-12-09 15 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") 
} 

모두 확인 설정, 내가 원하는대로. 그러나, 내가 직면하고있는 문제는 어떤 버튼을 클릭하든 관계없이 클로저 배열에서 마지막 기능을 수행한다는 것입니다. 따라서이 경우에는 어떤 버튼을 클릭하든 관계없이 "안녕"이 인쇄됩니다. 내가해야 할 것은 :

문제가 무엇인지
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

안녕하세요, 감사합니다. 나는 이미이 부분을 얻었다. 어떤 함수가 버튼 배열과 클로저 배열을 가져 와서 동일한 인덱스를 가진 버튼에 클로저를 모든 버튼에 하나씩 추가하는 것이 무엇이겠습니까 –