2017-12-05 1249 views
1
나는 기능이

하지 않고있는 UIButton에 addTarget을하는 방법... 보낸 사람

내 NewButton를 만들 때 내가 연결
func MyFunc (_ sender: AnyObject) { 
    let n = sender.tag! //do stuff with 'n' 
} 

...

NewButton.addTarget(self, action: #selector(Main.MyFunc(_:)), for: .touchUpInside) 

내가 전화를하고 싶습니다 MyFunc 내 코드의 다른 영역에 보낸 사람이 없습니다. 보낸 사람을 사용하지 않고 Button에 .addTarget을 적용 할 수 있습니까?

같은 ....

NewButton.addTarget(self, action: #selector(Main.MyFunc(n: 5)), for: .touchUpInside) 

및 ...

func MyFunc (n: Int) { 
    //do stuff with 'n' 
} 

나는 하나 개의 솔루션은 같은 라우팅 기능이 될 것입니다 알고 ...

func router (_ sender: AnyObject) { 
    MyFunc(n: sender.tag!) 
} 

하지만 더 우아한 방법이 있는지 궁금합니다.

+0

무엇? 왜 버튼을 매개 변수로 전달하지 않습니까? 네, 발신자없이 타겟을 생성 할 수 있습니다. 그냥 논쟁을하지 마십시오. 연결하면 스토리 보드를 통해 의미하는 것입니다. 그렇다면 발신자가 있어야합니다. – Brandon

답변

1

이 함수는 AnyObject 유형의 보낸 사람을 사용하므로 어떤 개체도 함수의 인수로 사용할 수 있습니다. 그런 다음 조건부로 원하는 유형으로 캐스트해야합니다.

let button = UIButton() 
button.addTarget(self, action: #selector(touched(_:)), for: .touchUpInside) 

touched(1 as AnyObject) // Works 

@objc func touched(_ sender: AnyObject) { 
    if let casted = sender as? Int { 
     // Do something with casted as an Int 
    } else if let casted = sender as? UIButton { 
     // do something with casted.tag 
    } 
} 
+0

이것은 작동합니다. 고맙습니다 – Dustin