2015-01-08 3 views
2

버튼을 눌렀을 때 호출하고 싶은 함수가 있지만, 지금까지했던 것과는 다른 어떤 함수에서든 접근 할 수 있기를 원합니다. 여러 ViewController. 나는 각 ViewController에서 동일한 코드 덩어리를 복제하고 싶지 않습니다.UIButton의 클래스 외부에서 함수 호출하기

ViewController 클래스 외부에서 호출 할 함수를 정의하려고했지만 대상에 도달하기 위해 필요한 설정이 무엇인지 알 수 없습니다. 함수가 클래스 내에 정의되어 있기 때문에 일반적으로 self이 사용되지만 다른 파일 및/또는 클래스 외부의 함수 인 경우 어떻게합니까?

button.addTarget(???, action: "myFunction:", forControlEvents: UIControlEvents.TouchUpInside) 

편집 : 또 다른 해결책은 내가 이런 일을하고 내가 버튼을 생성하는 함수 내에서 호출 할 함수를 정의하는 것입니다 사용할 수있을 것입니다,하지만 난 모르고 같은 문제로 실행 무엇을 target에 도달해야합니다.

class ViewController { 
    // Main code here 
} 

func makeButton() { 
    // Code to make button here 
    button.addTarget(???, action: "buttonPressed",...) 

    func buttonPressed() { 
     // Code that runs when the button is pressed goes here 
    } 
} 

미리 감사드립니다.

답변

3

일반적으로 다른 클래스를 만들고 거기에 코드를 구현 한 다음 클래스의 인스턴스를 만들고 유지하여 대상으로 설정합니다.

+0

답 해 주셔서 감사합니다. 내가 제안한 것을 시도해 보았고 viewDidLoad에서 만든 인스턴스에서 새 클래스의 함수를 호출 할 수 있었고 버튼의 대상으로 설정할 수 있었지만 시뮬레이터에서 실행하고 앱이 충돌하고 콘솔에 오류 코드 또는 오류 보고서가 표시되지 않는 버튼. 그 일이 왜 일어날 지 아십니까? – Erik

+0

당신은 당신이 창조하고 대상으로 설정 한 물체를 보유하지 않고 유지합니다 ... – Wain

+0

당신 말이 맞습니다. 선언을 레벨을 고정 시켜서 움직여 라! 정말 고마워! – Erik

1

함수가 포함 된 클래스에 대한 참조를 전달해야합니다. 예를 들어, 싱글 톤 패턴을 사용하는 경우 :

button.addTarget(FunctionEngine.sharedInstance, action: "buttonFunction", ... 
+0

'sharedInstance'가 무엇인지 자세히 설명해 주시겠습니까? 필자는 함수라고 생각했지만, sharedInstance라는 메서드로 FunctionEngine이라는 클래스를 작성하여 솔루션을 구현하려고하면 대상이 객체 여야하기 때문에 오류가 발생했습니다. – Erik

+0

예를 들어 직접 구현해야합니다. [이] (http://stackoverflow.com/a/24073016/427083)처럼. 그것은 당신이 [Singleton Pattern] (https://developer.apple.com/library/mac/documentation/General/Conceptual/DevPedia-CocoaCore/Singleton.html)을 알고 있다고 생각했습니다. – Mundi

6

여기에서 전체 자습서를 찾을 수 있습니다. https://github.com/fatihyildizhan/SingletonFunctionForAddTarget

당신이 그것을 다운로드 할하지 않으려면 : 당신은 아마이 오류거야하지 않을 경우

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet weak var btnGotoVacation: UIButton! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     btnGotoVacation.addTarget(MySingletonClass.sharedInstance, action: Selector("visitBodrum:"), forControlEvents:.TouchUpInside) 
    } 
} 

class MySingletonClass:NSObject { 
    static let sharedInstance = MySingletonClass() 

    func visitBodrum(sender:AnyObject) { 
     print("don't forget to visit yalikavak :) ") 
    } 
} 

The key point is that you should inherit your singleton class from NSObject .

을 : enter image description here

을하고 당신이 할 경우 :

enter image description here

+0

#selector 구문을 사용하여 iOS 9에서이 작업을 수행하는 방법에 대한 아이디어가 있으십니까? 같은 클래스에 있지 않으므로 visitBodrum()을 타겟팅 할 수 없습니다. – mattgabor

+1

try #selector (visitBodrum (_ :)) – fatihyildizhan

+0

맞아요.하지만 ViewController 클래스에 작성한 경우 visitBodrum 함수는 ViewController 클래스의 멤버가 아니기 때문에 인식하지 못합니다. #selector (MySingletonClass)라고 생각했습니다.sharedInstance.visitBodrum (_ :))하지만 충돌합니다. – mattgabor

관련 문제