2017-02-23 2 views
2

UILabel을 포함하는 UIView 클래스가 있습니다. UILabelUITapGestureRecognizer을 추가했으며 performSegue을 입력하여 UILabel의 탭에 새로운 UIViewController을 엽니 다. UIView 클래스에 performSegue을 사용할 수 없다는 것이 문제입니다.swift에서 UIView 클래스의 performSegue를 사용하는 방법 3

누구나 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의 인스턴스를 작성한 후 의 인스턴스를 작성한 후 UIViewController에서 액세스 할 수 있도록 을 UIView에 등록 할 것을 제안합니다.

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) 

을 당신은 당신의 UIViewControllertap() 기능을 할 것이다 : 그런 다음 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이 특정보기를 사용하고 있습니다.

그런 다음 해당 참조를 사용하여 perform 메소드를 호출하십시오. 사용자 정의보기를 프로그래밍 방식으로 추가되는 경우

예를 들어, 당신은 그냥이 속성에 할당 인스턴스화 한 후 다음

weak var myVC : UIViewController? 

처럼 클래스에 추가 속성을 추가 할 수 있습니다.

그런 다음이 SEGUE이됩니다 수행


myVC?.performSegue.... 
은 또한 당신은 다음 거기에서보기 쇼 그것을 가지고,이보기를 사용하고있는 UIViewController에서 탭 제스처 인식기를 추가 할 수 있습니다.


아니면 그냥 사용할 수 있습니다

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

그러나 당신이 할 경우이 사람이 당신이 제시하고 현재 rootViewController 인 무슨에 따라 의도하지 않은 결과가있을 수 있습니다, 당신은주의해야합니다.

0

만들기 UIView의 클래스에 위임하고 당신이 시도하고 UIViews에서 모든 기능을 분리해야 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) 
    } 

} 
관련 문제