2017-10-22 11 views
-1

이 주제에 대한 다른 모든 게시물을 읽었지만 도움이되지 않습니다.UITabbarController에서 segue가 호출되지 않도록 준비하십시오.

두 개의 탭을 실행하는 UITabBarController가 있습니다. tab1에서 수집 된 데이터를 UITabBar ViewController에 전달하려고합니다. 이것에 대해 delegete 프로토콜을 사용하려고하지만 보내는 ViewController에서 대리자 변수를 설정하는 데 문제가 있습니다. segue에 대한 준비는 결코 부르지 않습니다. 나도 탭 컨트롤러의 ViewDidLoad() 안에있는 탭의 viewcontroller를 순환시키지 못합니다. 아직 생성되지 않았고 아무 것도 없기 때문입니다.

이전에 대리인을 사용했으며 다소 단순합니다. Tabbar에서 사용하는 것이 중요합니까?

코드를 실행하면 TabBarViewController의 viewDidLoad()가 호출되지만 preparefor segue는 호출되지 않습니다.

MeViewController에서 IBAction donePressed가 호출되었지만 대리자가 설정되지 않은 것으로 호출되지 않습니다. 왜 당신은 당신의 tabbarController 비록 약간의 정보/데이터를 수신하고 싶어, 모든

protocol DetailsDelegate: class { 
    func myDetailsGathered(myDetails: MyDetails) 
} 

/// RECEIVING VIEW CONTROLLER 

class TabBarViewController: UITabBarController, DetailsDelegate 
{ 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    { 
     print("prepare for segue called\n"); 

     if let destinationViewController = segue.destination as? MeViewController 
     { 
      destinationViewController.delegate = self 
     } 

    } 

    override func viewDidLoad() 
    { 
     print("ViewDidLoad Called \n") 
    } 

    func myDetailsGathered(myDetails: MyDetails) 
    { 
     self.myDetails = myDetails 
     print("My details gathered \n") 
    } 

} 

--------------- 
/// SENDING VIEW CONTROLLER 

class MeViewController: UIViewController 
{ 
    weak var delegate: DetailsDelegate? 

    override func viewDidLoad() 
    { 
     super.viewDidLoad() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    override func viewDidLayoutSubviews() { 
     super.viewDidLayoutSubviews() 
    } 

    // I have UIButton in the view and this is invoked when its pressed. 
    @IBAction func donePressed(_ sender: Any) 
    { 
     var infoToPass = MyDetails() 

     print("looks like we are done") 
     delegate?.myDetailsGathered(infoToPass: myDetails) 
    } 

} 

답변

0

첫째 - 여기

코드인가?

segue 준비가 호출되지 않습니다.

prepareForSegue 메서드는 performSegue 바로 뒤에 호출됩니다. 그렇다면 performSegue 방법은 무엇입니까? 또는 segueMeViewController으로가는 것이 확실합니까?

또 다른 옵션은 NotificationCenter입니다.

+0

다른 작업을 수행하고 두 번째 탭으로 보낼 수 있도록 보내기를 원합니다.나는 내가 제대로 섹스를 이해하지 못한다는 것을 알고, 나는 그것에 대해 읽을 것이다. 대리자를 초기화하는 또 다른 방법이 있습니까? – SFlow

0

prepareForSegue은 segue를 수행 할 때 호출됩니다. 당신이하지 못하는 이유는 그것이 부르지 않는 이유입니다.

segue는 앱의 스토리 보드 파일에서 두 개의보기 컨트롤러 간의 전환을 정의합니다.

변수를 저장하고 다른 컨트롤러간에 액세스하려면 singleton 클래스를 사용해야합니다.

Singleton.sharedInstance.name = "Some name" 

가 어떤 컨트롤러에서 그것에서 읽으려면 :

class Singleton { 
    static let sharedInstance = Singleton() 
    var name = "" 
} 

지정 싱글로 :이처럼 하나를 선언

let name = Singleton.sharedInstance.name 
+0

prepareForSegue는 ViewController 초기화의 일부라고 생각했습니다. 잘 알고 있습니다. 싱글 톤을 사용하고 싶지 않다면, 어떻게 델리게이트를 초기화 할 수 있습니까? – SFlow

+0

@SFlow, 그렇지 않습니다. Segue가 수행되고 있음을 View Controller에 알린다. –

+0

세그 (Segues)를 사용하지 않고 델리게이트를 초기화하는 또 다른 방법이 있습니까? 내가하고 싶은 것은 대리인을 초기화하고 segues 사용에 신경 쓰지 않는 것뿐입니다. – SFlow

0

어쩌면 내가 이해하지, 그런데 왜 당신에게하지 않습니다 tab bar delegate을 사용 하시겠습니까?

func tabBarController(UITabBarController, didSelect: UIViewController) 

정확히 원하는대로하지 않습니까? 그것은 내가 당신을 위해 준비한 코드를 붙여 넣을 곳이라고 생각합니다.