2017-05-14 1 views
1

사용자 정의 컨트롤을 생성했으며 @IBInspectable 속성에 액션을 전달하여 UIButton을 사용하여 @IBAction을 설정하는 것과 동일한 효과를 얻고 싶습니다. 어떻게해야합니까?Swift 3의 IBInspectable을 통한 전달 선택기

class MyControl: UIButton { 
    // Problem with this string approach is 
    //I have no way to know which instance to perform the selector on. 
    @IBInspectable var tapAction: String? 

    // set up tap gesture 
    ... 

    func labelPressed(_ sender: UIGestureRecognizer) { 
    if let tapAction = tapAction { 
     // How should I convert the string in tapAction into a selector here? 
     //I also want to pass an argument to this selector. 
    } 
    } 
} 
+0

'tapAction' 변수가 어떻게 설정되어 있는지 궁금하십니까? 나는'tapAction' 값을 바꾸는 원인이 무엇인가요? – user1046037

+0

인터페이스 빌더에서 설정 중입니다. – Boon

+0

스위치 케이스를 사용하여 일련의 문자열 값을 기반으로 적절한 선택기를 설정하십시오. 제 개인적인 견해로는'IBInspectable' 변수를 사용하는 대신 프로그래밍 방식으로 훨씬 쉽게 할 수 있습니다. – user1046037

답변

0

난 정말 내 솔루션입니다 ... 여기 당신이 원하는 않는 이유를 알고 있지만하지 않습니다

class MyActions: NSObject { 
    func foo() { 
     print("foo") 
    } 

    func bar() { 
     print("bar") 
    } 

    func baz() { 
     print("baz") 
    } 
} 
:

MyControl 호출 할 수있는 행동과 더불어, MyActions 클래스를 만듭니다

class MyControl: UIButton { 

    @IBInspectable var actionClass: String? 
    @IBInspectable var tapAction: String? 
    private var actions: NSObject? 

    override func awakeFromNib() { 
     // initialize actions class 
     let bundleName = Bundle.main.bundleIdentifier!.components(separatedBy: ".").last! 
     let className = "\(bundleName).\(actionClass!)" 

     guard let targetClass = NSClassFromString(className) as? NSObject.Type else { 
      print("Class \(className) not found!") 
      return 
     } 

     self.actions = targetClass.init() 

     // create tap gesture 
     let tap = UITapGestureRecognizer(target: self, action: #selector(pressed(_:))) 
     self.addGestureRecognizer(tap) 
    } 

    func pressed(_ sender: UIGestureRecognizer) { 
     actions!.perform(Selector(tapAction!)) 
    } 
} 

그리고, 설정 attribu에 MyControl 클래스를 교체

당신은 예를 들어, 실행 시간에 눌러 동작을 변경할 수 있습니다 :

@IBAction func buttonChangeAction(_ sender: Any) { 

    buttonMyControl.tapAction = textField.text! 
} 

은 어쩌면 당신은 매개 변수를 전달하는 코드를 변경 할 수 있습니다,하지만 ... 그것은 당신의 당신의 버튼 TES 필요?