2017-02-23 113 views
2

使用performSegue從UIView類我有一個UIView類,它包含一個UILabel。我加入了一個UILabelUITapGestureRecognizer想做performSegueUILabel的水龍頭打開一個新的UIViewController。 的問題是,我不能在UIView類使用performSegue如何迅速3

誰能請幫助UIView類使用performSegue

我加了點觸手勢,以我的標籤爲,

nameLabel.isUserInteractionEnabled = true 

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

現在,

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

你應該嘗試從UIViews分離的任何功能。最佳做法是您的UIViewControllers負責您的應用中的任何功能,並且您的UIViews僅用於顯示元素。因此,我建議您在UIView中設置nameLabel屬性,以便在實例化UIView後,您可以從UIViewController訪問該屬性。然後在你的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) 

,你將有你的tap()功能在你的UIViewController

+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

但我無法使用navigationController,因爲它是一個UIView類 – manini

+0

@manidev你需要向我們展示你正在嘗試的代碼,沒有它,沒有人知道你錯過了什麼。 –

0

你寫的錯誤是錯誤的,UIViewController的確實有方法。你的錯誤必須是「UIVIew沒有成員...」,至於解決方案你只需要引用任何UIViewController使用這個特定的視圖。

然後使用該引用調用你的執行方法。

例如,如果您的自定義視圖被編程添加,您可以將額外的屬性就像

weak var myVC : UIViewController? 

然後實例,它只是把它分配給該屬性後添加到您的類。

然後執行SEGUE變爲:

myVC?.performSegue.... 

或者你可以從使用該視圖中添加的UIViewController點擊手勢識別,然後有視圖顯示它從那裏。


或者你可以只使用:

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

但是,如果你這樣做,你應該小心,因爲這一次也許有意想不到的後果取決於你所提出和這是當前RootViewController的。

0

在UIView類進行委派,並用於您所使用的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) 
    } 

}