2017-05-11 10 views
0

사용자 지정 경고를 만들려고했는데 단추에 대한 완료 처리기를 구현하려고 미쳤습니다. 나는 몇 가지, 마지막으로 UIButton의 selector addTarget 함수를 전달하기 위해 func 배열을 만들지 만 작동하지는 않았다.버튼을 사용하여 경고를 만드는 사용자 정의 클래스입니다. 완료 처리기를 추가하는 방법?

문제 (여기서 ******이다없는) :

내가 할 수없는 어려운 코딩 부분이다 "#selector의 인수는 더는 방법, 재산 또는 초기화를 @obc 참조 않습니다" 내가 아래 클래스와 함께 개체를 만드는 내보기 컨트롤러에서받은 몇 가지 코드로 선택기를 구성하십시오.

class Alert: NSObject { 

func showAlert(){ 

    if let window = UIApplication.shared.keyWindow { 

     //configure some constraints and animations 
} 

var buttons: [UIButton] = [] 
var buttonsFunc: [() -> Void ] = [] 


func addNewButton(title: String, handler: @escaping() -> Void) { 
    buttons.append(createButton(title: title)) 

    buttonsFunc.append { 
     self.dismissAlert() 
     handler() 
    } 
} 

func setupButtons() { 

    for (index, button) in buttons.enumerated() { 
     boxView.addSubview(button) 

     //Here is the problem *************************** 
     button.addTarget(self, action: #selector(buttonsFunc[index]), for: .touchUpInside) 


     //More constraints(not important) 
     button.centerXAnchor.constraint(equalTo: boxView.centerXAnchor).isActive = true 
     button.widthAnchor.constraint(equalTo: (button.titleLabel?.widthAnchor)!).isActive = true 
     button.heightAnchor.constraint(equalToConstant: 25).isActive = true 
    } 

} 

func dismissAlert(){ 
    //Animation to dismiss my alert 
} 

다른 기능 :

//Even if its not important the function i use to create the button 

func createButton(title: String) -> UIButton { 
    let button = UIButton(type: .system) 
    button.backgroundColor = .clear 
    button.setTitle(title, for: .normal) 
    button.titleLabel?.sizeToFit() 
    button.setTitleColor(uPBlue, for: .normal) 
    button.titleLabel?.font = UIFont(name: uPFont, size: 20) 
    button.translatesAutoresizingMaskIntoConstraints = false 
    return button 
} 

모든 아이디어를 어떻게이 문제를 해결하기 위해? 아니면 완전히 다른 방법 일 수 있습니다. 그것이 작동한다면 나는 그것을 가져 가라.

+0

같은 버튼을 사용하고 여러 번을 구현할 수 있습니다 제목? 왜 버튼 배열을 가지고 있습니까? – luke

답변

1

따라서 선택자는 함수의 이름 일뿐입니다. 정의에 의한 클로저는 익명의 함수이므로이 방법으로는 할 수 없습니다.

... 
button.addTarget(self, action: #selector(Alert.buttonPressed(sender:)), for: .touchUpInside) 
... 

지금 우리가 활용할 수 있습니다

private func buttonPressed(sender: UIButton) { 

} 

그런 다음 버튼을 대신 폐쇄의이 기능을 제공 할 수 있습니다 :

은 버튼에 제공하는 새로운 함수를 정의, 다른 경로를 시도 할 수 있습니다 여기서 tuples입니다. 조치 : 대신 두 개의 분리 된 우리는 우리의 버튼에 대한 애드혹 데이터 구조를 가진 하나 개의 배열에 거 배열을 가진의

// var buttons: [UIButton] = [] 
// var buttonsFunc: [() -> Void ] = [] 
// Becomes 
var buttonActionArray: [(button: UIButton, action:() -> Void)] = [] 

지금 다른과 buttonPressed(sender:)

private func buttonPressed(sender: UIButton) { 

    for buttonTuple in buttonActionArray { 
     if buttonTuple.button === sender { 
     buttonTuple.action() 
     } 
    }  
} 
+0

놀라운. 고맙습니다. 나는 일어나고있는 일을 이해하지 못한다. 그러나 그것은 효과가있다. 마지막 것. 핸들러 이전에 버튼에 다른 기능을 추가하려면? 예 : dismissAlert() 함수 – Alexis

+0

@Alexis : 처리기 전에 다른 함수를 추가하면 무엇을 의미합니까? –