2017-12-08 8 views
0

私はちょっと立ち往生しています。 私はUIViewControllerと、UIViewに拡張されたカスタムpop.xibを持っています。 pop.xibpop.swiftに接続されています。 UIViewControllerボタンでは、.xibファイルがポップアップします。すぐに代理人を使用してボタンがxibファイルでクリックされたことをUIViewControllerに通知する方法はありますか?

pop.xibには、クリックしてデータベースにデータを送信するためのボタンがあります。

しかし、そのボタンがデータを送信するために pop.xibにクリックされたとき、私はしたい UIViewController

A)@IBAction func sendDataToDbAction(_ sender: Any)がクリックされたときに知っていると

b)のif文は、その後、現在sendDataToDbAction内側からfalseを返すとき私はpop.swift

でデリゲートを設定した 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 

@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() { 
    } 
} 
関連する問題