2017-12-08 6 views
0

나는 조금 붙어있다. 나는 UIViewController이고 UIView을 확장하는 사용자 정의 pop.xib이 있습니다. pop.xibpop.swift에 연결됩니다. UIViewController 버튼은 .xib 파일을 팝업합니다.신속하게 델리게이트를 사용하여 xib 파일에서 버튼을 클릭했다는 것을 UIViewController에 알리는 방법은 무엇입니까?

pop.xib에는 데이터베이스에 데이터를 보내기 위해 클릭하는 버튼이 있습니다.

하지만 버튼이 데이터를 전송하는 pop.xib에서 클릭 할 때 내가 원하는 UIViewController

가) @IBAction func sendDataToDbAction(_ sender: Any)을 클릭 할 때 알고

b)는 if 문 다음 현재 sendDataToDbAction 내부에서 false를 반환 할 때 UIViewController

//pop.swift 

    class Pop: UIView { 

      @IBOutlet var delegate: AnswerDelegate? 

      @IBAction func sendDataToDbAction(_ sender: Any) 
      { 
        if(answer == false) 
        { 
          don't send to db 
          alert pops up saying answer is false 
        } 
        else 
        { 

        } 

      } 
     } 

에 대한 경고가 나는 pop.swift에 대리자를 설정 한

//pop.swift 

@objc protocol AnswerDelegate { 

    func isCorrectAnswer() 
} 



//UIViewController 

extension UIViewController:AnswerDelegate{ 

//set the pop.xib delegate to self 
// implement func isCorrectAnswer 

} 

내가 원하는 것을 위임자가 어떻게 사용할 수 있는지 잘 모르겠습니다.

감사합니다.

답변

2

이것을 확인하면 다음과 같이 할 수 있습니다.

Pop.swift

@objc protocol AnswerDelegate { 
    func isCorrectAnswer() 
} 

class Pop: UIView { 

    var answerDelegate: AnswerDelegate? 

    class func instanceFromNib() -> Pop { 
     return UINib(nibName: "Pop", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! Pop 
    } 

    @IBAction func sendDataToDbAction(_ sender: Any) 
    { 
     if(answer == false) { 
      //Alert 
     } 
     else { 
      answerDelegate?.isCorrectAnswer() 
     } 
    } 
} 

컨트롤러 :

class ViewController: UIViewController, AnswerDelegate { 

    func isCorrectAnswer() { 

    } 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     let popView = Pop.instanceFromNib() 
     popView.frame = CGRect(x: 0, y: 0, width: 50, height: 50) 
     popView.answerDelegate = self 

     self.view.addSubview(popView) 
    } 
} 
0

나는 당신이 당신의 뷰 컨트롤러에 어딘가에 대리자를 설정해야대로 확장에이 작업을 수행 할 수 있도록 확실하지 않다.

아래 대리자 함수를 호출하기 위해 pop.swift를 조정합니다, 당신의 뷰 컨트롤러에서

@IBAction func sendDataToDbAction(_ sender: Any) { 
    if(answer == false) { 
    // show alert 
    } else { 
    delegate?.isCorrectAnswer() 
    } 
} 

을 대리자를 설정하고 아래와 같은 기능 추가 :

class MyViewController: UIViewController, AnswerDelegate { 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    pop.delegate = self 
    } 

    func isCorrectAnswer() { 
    } 
} 
관련 문제