2017-02-23 16 views
2

私はUIViewクラスにはUILabelが含まれています。 UILabelUITapGestureRecognizerを追加しました。performSegueを実行して、UILabelのタップで新しいUIViewControllerを開きます。 UIViewクラスにはperformSegueを使用できないという問題があります。swiftのUIViewクラスからperformSegueを使用する方法

UIViewクラスには誰でもperformSegueを使用できますか?

私は、

私tapFunctionで今
nameLabel.isUserInteractionEnabled = true 

let tap = UITapGestureRecognizer(target: self, action: #selector(tapFunction)) 
tap.numberOfTapsRequired = 1 
tap.numberOfTouchesRequired = 1 
tap.isEnabled = true 
nameLabel.addGestureRecognizer(tap) 

、と私のラベルに

func tapFunction(sender:UITapGestureRecognizer) { 
    print("tap working") 
    self.performSegue(withIdentifier: "memberSegue", sender: self) 
} 

をタップジェスチャーを追加した。しかし、私はエラーを取得する:

"Value of type UIViewController has no member performSegue"

そのままUIViewクラス

+0

現在お試しになっているコードを表示できますか? –

+0

コードを共有してくださいUIViewクラス –

答えて

2

をUIViewのを使用している場所に使用。 UIViewControllersはアプリの機能を担当し、UIViewsは要素の表示にのみ使用することをおすすめします。したがって、UIViewのインスタンスを作成した後、UIViewのインスタンスを作成した後にUIViewControllerからアクセスできるように、UIViewのプロパティをnameLabelにすることをお勧めします。次に、あなたのUIViewControllerのコードは次のようになります。

let yourView = new YourView() 
let tap = UITapGestureRecognizer(target: self, action: #selector(tapFunction)) 
tap.numberOfTapsRequired = 1 
tap.numberOfTouchesRequired = 1 
tap.isEnabled = true 
yourView.nameLabel.addGestureRecognizer(tap) 

、あなたのUIViewControllerであなたのtap()機能を持っているでしょう。

+0

それは働いた:)ありがとう。 – manini

0

segueの代わりにそのタップジェスチャーのアクションを追加することをお勧めします。

TapRecognizer.addTarget(self, action: #selector(YourFunc)) 

SamleのFunc:

func YourFunc(){     
     let storyBoardHome = UIStoryboard(name: "", bundle: nil)   
    let memberController = storyBoardHome.instantiateViewController(withIdentifier: "") 
      self.navigationController?.pushViewController(memberController, animated: true) 
       } 

これを参照してください:あなたが書いたhttps://stackoverflow.com/a/26366366/6818278

+0

私は既にタップジェスチャーのアクションを追加しています。 – manini

+0

しかし、UIViewクラスであるためnavigationControllerを使用することができません – manini

+0

@manidevあなたが見逃していることを誰も理解していない状態で、あなたが試しているコードを表示する必要があります。 –

0

エラーが間違っている、のUIViewControllerのそのメソッドを持っています。あなたのエラーは、 "UIVIewにメンバーがありません..."でなければなりません。ソリューションに関しては、この特定のビューを使用しているUIViewControllerの参照を取得するだけです。

次に、その参照を使用してperformメソッドを呼び出します。例えば

カスタムビューをプログラムで追加されている場合、あなたはそれだけでこのプロパティに割り当てインスタンス化した後、その後

weak var myVC : UIViewController? 

のようなあなたのクラスに余分なプロパティを追加することができます。

myVC?.performSegue.... 

代わりにあなただけのビューがあるからそれを示していた後、このビューを使用しているのUIViewControllerからタップジェスチャー認識を追加することができます。

その後インクルードはセグエになる行います。


それとも、単に使用できます。

UIApplication.shared.keyWindow?.rootViewController.performSegue... 

しかし、あなたがしなければこの1つはあなたが提示し、現在のrootViewControllerしているしているかに応じて、意図しない結果が生じる可能性として、あなたは注意する必要があります。

0

あなたはUIViewsから任意の機能を試してみて、分離すべきであるのUIViewクラスでデリゲートを作成し、あなたがYourcontrollerクラスで

protocol UIViewDelegate 
{ 
func tapFunction() //this function will be use in controller class which uiview are using 
} 

var delegate: UIViewDelegate? 
func tapFunction(sender:UITapGestureRecognizer) 
{ 
delegate?.tapFunction() 
} 

class Yourcontroller: UIViewController, UIViewDelegate 
    { 
    let yourView = YourView() 
    yourView.delegate = self 

    func tapFunction() 
    { 
    self.performSegue(withIdentifier: "memberSegue", sender: self) 
    } 
    } 
0

あなたはプロトコルと委任によってそれを行うことができます。実際にはUIViewから行うことはできませんので、常にコントローラから行うべきです。

/// add this protocol in your project 
protocol ViewProtocol { 
    func performSegueFromView() 
} 

class View : UIView { 

    /// add this line to your view 
    var delegate : ViewProtocol? 


    /// replace your tap function with this 
    func tapFunction(sender:UITapGestureRecognizer) { 

     print("tap working") 

     self.delegate?.performSegueFromView() 
    } 

} 


class ViewController : UIViewController, ViewProtocol { 

    override func viewDidLoad() { 

     /// create view 
     let view = View() 
     /// assign view delegate 
     view.delegate = self 

    } 

    /// delegate function 
    func performSegueFromView() { 
     ///peform segue from controller because you can not do this from uiview anyway 
     self.performSegue(withIdentifier: "memberSegue", sender: self) 
    } 

} 
関連する問題