2017-12-05 3 views
0

하위 뷰 컨트롤러를 가져 오려고합니다. 하위 뷰 컨트롤러의 아래쪽에있는 뷰 컨테이너에 표시하려고합니다. 자식의 버튼을 누르면 "기본 VC에서 누른 버튼"이 콘솔로 인쇄되지만 "주 VC에서 누른 버튼을 누르십시오"는 표시되지 않습니다. 기본 View Controller에서 두 번째 메시지를 호출하는 함수가 필요합니다.스위프트 대리자가 부모에서 함수를 호출하지 않습니다.

protocol BasicVCDelegate: class { 
    func warmButton() 
} 

class BasicViewController: UIViewController { 
    weak var BasicVCDelegate: BasicVCDelegate? 

    @IBOutlet weak var warmButton: UIButton! 

    @IBAction func warmButton(sender: AnyObject) { 
     print("Button pressed from Basic VC") 
     BasicVCDelegate?.warmButton() 
    } 
} 

그리고 ViewController.swift

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, BasicVCDelegate { 
    override func viewDidLoad() { 
     pauseButton.isEnabled = false 

     hideAll(); 
     self.basicContainer.isUserInteractionEnabled = true; 
     self.basicContainer.isHidden = false; 

     self.timerLabel.text = String("00:00:00"); 

     eventTable.dataSource = self 
     eventTable.delegate = self 

     loadEvents(event: "timer start") 
     super.viewDidLoad() 
    } 

    // CREATE SEGUEs 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if let nav = segue.destination as? UINavigationController, let classBasicVC = nav.topViewController as? BasicViewController { 
      classBasicVC.BasicVCDelegate = self 
     } 
    } 

    // FUNCTIONS FOR BASIC VIEW CONTROLLER TO REFERENCE 
    func warmButton() { 
     print("Warm button pressed from main VC") 
    } 
} 

편집에서 : 아래 모두에서 , 그것의 ViewController 코드의 다음 섹션이 문제를 일으키는 것 같다 (라인 여기에 관련 BasicViewController 코드는 내 문)가 호출되고 있지 않을 경우 :

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let nav = segue.destination as? UINavigationController, let classBasicVC = nav.topViewController as? BasicViewController { 
     classBasicVC.basicVCDelegate = self 
    } 
} 

이 때문에 대표와 preparefo 내 익숙에 아마 rsegue 기능.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let nav = segue.destination as? BasicViewController, let classBasicVC = nav.basicVCDelegate { 
     print("got here!!") 
    } 
} 

FINAL : 은 몇 가지 사용자의 제안에 따라 다음 (가 프린트 문에 도달하지 않음) 위의 코드를 대체 :

EDIT 2 "경우에하는 것이하자"고 따라야 알아내는 데 도움이 필요 편집 : 도와 줘서 고마워! 주변을 돌아 다니고 나면 다음 작업이 수행됩니다 (주소를 지정할 때 오류로 바뀌는 경고를 제외하고 - 나는 경고와 함께 살 수 있습니다). 당신은 당신의 ViewController 년대에 이것을 추가의 ViewController

에 버튼의 대리자를 지정하지 않은

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let classBasicVC = segue.destination as? BasicViewController { 
     classBasicVC.basicVCDelegate = self 
    } 
} 
+0

같은 위임 변수에 카멜 케이스를 사용하는 것이 좋습니다? –

+0

이 튜토리얼은 Push에서 작동하지만 현재는 https://iosdevcenters.blogspot.com/2017/11/what-is-protocol-how-to-pop-data-using.html classBasicVC를 제공 할 때도 사용할 수 있습니다. BasicVCDelegate = 자기 않습니다. –

+2

FYI - 소문자로 시작하는 변수 및 메서드의 이름을 지정하는 것이 일반적입니다. 클래스 및 구조체 이름은 대문자로 시작합니다. 대리인 속성의 이름을 올바르게 지정해야합니다. – rmaddy

답변

0

그것은 대신 마지막 편집이 코드를해야한다 viewDidLoad

override func viewDidLoad() { 
    //other code 
    yourButton.BasicVCDelegate = self 
    } 
또한 당신이 실제로이라고 볼 않는 당신이`classBasicVC.BasicVCDelegate = self`에 중단 점을 넣을 경우,이 basicVCDDelegate

0

:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let nav = segue.destination as? BasicViewController, let classBasicVC = nav as? BasicViewController? { 
     classBasicVC?.basicVCDelegate = self 
    } 
} 
관련 문제