2016-07-12 2 views
0

へのUIViewからイベントを公開するために、私は次のコードでのUIViewを持っている:方法のUIViewController

import UIKit 


class ServiceAuthHeaderViewController: UIView { 


    @IBOutlet var lblHeaderTitle: UILabel! 
    @IBOutlet var btnAddService: UIButton! 

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

    @IBAction func onAddService(sender: AnyObject) { 
     // I want other UIViewControllers to know when this event ocurrs 

    } 
} 

今、私はUIViewのインスタンスを作成しUIViewControllerを持っている:

var headerView = ServiceAuthHeaderViewController.instanceFromNib() 
     headerView. // here I want to attach the onAddService event. 

どれでもそれを行う方法のヒント?

はそれを行うために複数の方法があります

答えて

1

@fiksのようなデリゲートとコールバックのほかに、単にadd targetを使用することもできます。

ステップ1: 変更は、あなたがそのIBOutletにアクセスできるように、代わりにUIViewServiceAuthHeaderViewを返すために、次の。これをUIViewのサブクラス化としてからServiceAuthHeaderViewControllerにリネームしました。

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

ステップ2:UIViewControllerをサブクラス化し、あなたの親でviewDidLoad

class ServiceAuthViewController: UIViewController { 

    override func viewDidLoad() { 
     let headerView = ServiceAuthHeaderView.instanceFromNib() 
     headerView.btnAddService.addTarget(self, action: #selector(ServiceAuthViewController.btnAddServicePressed(_:)), forControlEvents: .TouchUpInside) 
    } 
} 

ステップ3でbtnAddServiceターゲットを追加:あなたは、セレクタに入力されたターゲット・アクションを作成し、何をすべきかボタンが押し込まれたときに必要になります。

func btnAddServicePressed(button: UIButton) { 
    print("Code for button pressed should be place here") 
} 
1

それを感謝しています。

委任パターンを使用しています。

protocol ServiceAuthHeaderViewDelegate { 
    func onAddService(sender: AnyObject) 
} 

class ServiceAuthHeaderView: UIView { 
    var delegate: ServiceAuthHeaderViewDelegate? 

    @IBOutlet var lblHeaderTitle: UILabel! 
    @IBOutlet var btnAddService: UIButton! 

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

    @IBAction func onAddService(sender: AnyObject) { 
     delegate?.onAddService(sender) 
    } 
} 

class MyViewController: UIViewController, ServiceAuthHeaderViewDelegate { 
    var myServiceAuthHeaderView: ServiceAuthHeaderView? 

    // some initialization function 
    func initViews() { 
     myServiceAuthHeaderView?.delegate = self 
    } 

    func onAddService(sender: AnyObject) { 
     // handling of the callback. 
    } 
} 

コールバックとしてクロージャを使う::

class ServiceAuthHeaderView: UIView { 
    var onAddServiceCallback: ((sender: AnyObject) -> Void)? 

    @IBOutlet var lblHeaderTitle: UILabel! 
    @IBOutlet var btnAddService: UIButton! 

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

    @IBAction func onAddService(sender: AnyObject) { 
     onAddServiceCallback?(sender: sender) 
    } 
} 

class MyViewController: UIViewController { 
    var myServiceAuthHeaderView: ServiceAuthHeaderView? 

    // some initialization function 
    func initViews() { 
     myServiceAuthHeaderView?.onAddServiceCallback = { sender in 
      // handling the callback 
     } 
    } 
} 

どちらのアプローチが適しているあなたは、プロトコルを作成し、あなたのビューコントローラでそれを実装することができます

。 2番目のコードでは必要なコードが少なくて済みます(追加のプロトコルを作成する必要はありません)

関連する問題