2016-07-04 2 views
3

나는 하나의 UIButton을 가지고 있습니다. 여러 개의 작업을 실행하려면 동일한 UIButton을 사용하고 싶습니다. 먼저 프로그래밍 방식으로 버튼에 액션을 설정합니다.Swift에서 UIButton에 대한 작업 메서드를 재정의 할 수 있습니까?

button1.addTarget(self, action: #selector(ViewController.function1), forControlEvents: .TouchUpInside) 

다음으로 그 기능을 삭제하고 다른 작업을 추가하고 싶습니다.

button1.addTarget(self, action: #selector(ViewController.function2), forControlEvents: .TouchUpInside) 

버튼의 기존 타겟을 덮어 쓸 수 있습니까?

+0

그것은하지 않습니다 추가하기 전에 이전의 모든 작업을 제거해야 버튼에 하나 이상의 addTarget을 사용하는 감각은 "button -> IBAction, 그러면 액션 메서드 내에서 조건을 개발할 수 있습니다. –

답변

3

당신은 늘 이전 작업을 무시 제안 케이스를하지만, 호출되는 ViewController.function1ViewController.function2의 결과로 버튼에 두 번째 작업을 추가합니다.

당신은

button1.removeTarget(self, action: #selector(ViewController.function1), forControlEvents: .AllEvents)

를 사용하여 새로운 하나를 추가하기 전에 대상에서 이전 작업을 제거하거나 새

button1.removeTarget(nil, action: nil, forControlEvents: .AllEvents)

4

당신은 당신이 목표를 추가, 당신이 당신의 버튼을 removeTarget 방법을 사용하여 제거 할 수 있습니다

button1.removeTarget(self, action: #selector(ViewController.function1), forControlEvents: .AllEvents) 
0

를 트리거하는 새가 원인이됩니다 다른 하나 모두 작업을 추가하기 전에 대상에서 이전 작업을 제거해야합니다 :

func removeTarget(_ target: AnyObject?, 
     action action: Selector, 
forControlEvents controlEvents: UIControlEvents) 

편집 : 사용의 예를 들어 @Rohit KP의 답변을 참조하십시오. 당신은 '.AllEvents는 "당신이 필요에 따라 것을 다른 뭔가를 사용하는 것을 고려 할 수 있습니다 그러나.

2

을 당신이. 래퍼 함수를 ​​만들기 때문에하는 recommande 동적으로 추가/제거 타겟팅 할 수 있습니다 죽은 잠금 리드.

그래서 당신은 아마 항상 호출되는 함수를 작성하고 당신의 물건을 수행해야합니다

@IBOutlet func myWrapper(sender : AnyObject?) { 

if (conditionA) { 
    // do stuff A 
} else { 
    // do stuff B 
} 
} 
+0

당신이 말하는 교착 상태를 제공 할 수 있습니까? –

+1

이것은 Apple 프레임 워크를 준수하는 가장 현명한 대답입니다. –

+0

아니요. 코드를 모르므로 할 수 없습니다. 즉, 모든 대상을 제거하거나 2 대상을 추가하는 상태 일 수 있습니다. 보안을 유지하는 것은 정말로 어렵습니다. if-else 문을 사용하면 목표를 달성하는 데 더 안전한 방법 (및 디버그 가능 방식)입니다. – CZ54

관련 문제