2017-02-18 5 views
1

나는 이것에 대한 답을 찾는 데 가장 힘든 시간을 보내고 있습니다.xboard보기에서 스토리 보드 viewcontroller로 전환하는 방법 3

보기 컨트롤러 내에있는 스크롤보기 내에 xib보기가 있습니다. xib에는 액션이있는 버튼이 있으며 스토리 보드에있는보기 컨트롤러를 선택해야합니다. 나는 또한 주문 segue를 사용할 수 있고 싶다.

지금까지 스토리 보드에서 viewcontroller를 인스턴스화하여 그 부분으로 이어질 수 있다고 읽었습니다. 하지만 그 컨트롤러를 선물하는 법을 모르겠습니다. 어떤 도움

덕분에 ...

UPDATE :

이 내가 SEGUE을 수행하는 데 사용하고 코드입니다. 부모의 ViewController에서

: 코멘트에 언급 한 바와 같이 XIB보기 파일

 let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "sightWordController") 

     let parent = LevelSelectViewController.referenceVC! 

     let segue = InFromRightCustomSegue(identifier: "test", source: parent, destination: vc) 


     segue.perform() 
+1

연속보기는 일반적으로 스토리 보드 사용에만 국한됩니다. 당신은 어떤 방식으로 스토리 보드에 뷰의 전체 클래스를 구성 할 수있는 뷰를 추가해야 할 것입니다. 그런 다음 뷰에 segue를 연결할 수 있습니다. 그렇지 않으면, 이유 때문에 'UIStoryboardSegue'라고 불린다. – TheCodingArt

+0

코드에서 할당 할 수있는 커스텀 세그 (segue)를 사용한다면, 내가 믿는대로 수행 할 VC가 필요합니다. 즉, 응답 체인을 오르면 연관된 VC를 찾아이를 수행 할 수 있습니다. 일반적으로 사용자 정의 전환 및 일종의 대리자 콜백이 필요한 것 같습니다. segue를 유지하기 위해 코드를 복잡하게 만들 필요가 전혀 없습니다. – TheCodingArt

+0

방금 ​​작동했습니다. 내 가장 큰 문제는 부모 viewcontroller에 대한 참조를 얻고 그래서 나는 segue를 부를 수있다. 참조를 얻는 방법은 약간의 해킹입니다. 부모 뷰 컨트롤러에서 xib 파일 내에서 사용할 수있는 정적 참조 변수를 만들었습니다. 참조를 얻는 더 좋은 방법이 있습니까? 내 코드를 보여주기 위해 질문을 업데이트 할 것입니다. – Discoveringmypath

답변

3

에서

static var referenceVC: UIViewController? 


override func viewDidLoad() { 
    super.viewDidLoad() 
    print("viewdidload") 
    LevelSelectViewController.referenceVC = self 

    setupScrollView() 
} 

코드는 Segues는 일반적으로 documentation에서 언급 한 바와 같이 사용을 스토리 보드에 국한된다. 스토리 보드에 @IBDesignable과 같은 방식으로 맞춤 xib보기를 구현하고 xib에서 스토리 보드 파일/클래스로 보는로드를 가져올 수 있습니다. 이렇게하면 두 세계의 이점을 얻을 수 있습니다. 그렇지 않은 경우 다른 방식 (예 : delegates/target-action 이벤트 등)으로 접근 할 수 있습니다.

responder chain도 올라갈 수 있으며 스토리 보드에서로드 된 VC와 관련된 segue를 호출 할 수 있습니다 (세그는 특정 액션에 반드시 추가 될 필요는 없습니다). VC에 대한 참조를 얻고 세그먼트를 호출합니다. 다음 예와 같은 방식으로 응답 체인을 등반 할 수 있습니다.

protocol ChildViewControllerContainer { 
    var parentViewController: UIViewController? { get } 
} 


protocol ViewControllerTraversable { 
    func viewController<T: UIViewController>() -> T? 
} 

extension UIView: ViewControllerTraversable { 

    func viewController<T: UIViewController>() -> T? { 
     var responder = next 

     while let currentResponder = responder { 
      guard responder is T else { 
       responder = currentResponder.next 
       continue 
      } 

      break 
     } 

     return responder as? T 
    } 
} 

extension UITableViewCell: ChildViewControllerContainer { 
    weak var parentViewController: UIViewController? { 
     return viewController() as UIViewController? 
    } 
} 
+0

응답 해 주셔서 감사합니다. 확실히 지금 내 머리를 들여다 보았다. 내가 그랬던 것처럼 어떤 문제가 보이니? 내 질문에 내가 그것을 작동시키는 데 사용한 코드를 포함하도록 편집했습니다. – Discoveringmypath

+0

부모 VC를 참조하는 방식으로 정적 변수를 참조하면 안됩니다. 그 문제는 위의 코드로 해결됩니다. – TheCodingArt

+0

어쨌든 무슨 일이 일어나고 있는지 더 잘 이해할 수 있도록 코드에 주석을 포함 할 수 있습니까? – Discoveringmypath