2017-01-21 6 views
0

최신 Xcode/Swift/iOS.부모가 아닌 VC에서 포함 된 하위 VC를 업데이트 할 수 없음

나는 VC (TopBarVC라고 불리는)와 임베디드 세그 (segue)를 포함하는 마스터 VC (StartVC라고 불린다)를 가지고있다. 자식 VC에는 버튼을 누르면 세 번째 VC (CategoryPickerOverlayVC)로 모달 연결됩니다 (이 VC의보기는 범주 선택을위한 드롭 다운 상자의 역할을합니다). 옵션 자체는 세 개의 버튼으로 구성되어 드롭 다운 상자에서 선택

@IBAction func CategoryFilterButtonPressed(_ sender: Any) { 

    performSegue(withIdentifier: "toCategoryPickerOverlay", sender: self) 

} 

, 선택된 버튼의 제목은 아동 VC에서 버튼의 제목 텍스트를 대체하는 데 사용되어야한다.

마스터 VC에서는 embedding segue가 발생하는 시점에서 prepareforsegue를 사용하여 자식 VC에 대한 참조를 변수 "topBarReference"에 저장합니다.

var topBarReference: TopBarVC? 


    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {   
    if segue.identifier == "TopBarPane"{ 
     topBarReference = segue.destination as? TopBarVC 
    } 
} 

그럼, 드롭 다운 상자에서 단추 옵션 중 하나를 클릭 3 VC에서, 버튼 제목 ("topBarReference"를 통해) 아동 VC에있는 버튼을 업데이트 할 prepareforsegue을 통해 전송됩니다 .

 if segue.identifier == "unwindToStartVC"{ 

     let vc = segue.destination as! StartVC 

     vc.topBarReference?.filterButtonText = ((sender as! UIButton).titleLabel?.text)! 

    } 

세 번째 VC는 마스터 VC로 다시 연결됩니다. 하위 VC의 단추가 변경되면 Child VC의 변수 (filterButtonText)가 먼저 제목 텍스트로 설정되고이 변수가 Child VC의 viewDidAppear 메서드를 통해 단추 제목 텍스트를 설정하는 데 사용된다는 것을 추가해야합니다.

디버거를 사용할 때 Master VC의 viewDidAppear가 unwind (실행 후 viewDidAppear에서 진단 출력 프린트 콘솔을 배치하고 unwind segue 이후에 아무 것도 출력하지 않음) 후에 실행되지 않는 것으로 나타났습니다. 이 버튼을 업데이 트되지 설명 할 실현하지만 난 왜 viewDidAppear가 실행되지 않습니다 몰라.

나는 위임 프로토콜과 instantiateViewController (withString :)를 사용하지 않으려 고 노력했다. 모든 메소드가 동일한 결과를 생성합니다. 즉, 하위 VC의 단추가 갱신되지 않습니다. 오류는 표시되지 않습니다. 다른 모든 것은 예상대로 발생합니다.

내가 뭘 잘못하고 있는지에 대한 아이디어가 있습니까?

+0

둘 다 StartVC에 "임베드 된"경우, 즉 StartVC가 여전히 표시되면보기가 나타나지 않는 것으로 나타납니다. 알림을 사용해보세요. startVC에서 특정 알림을 수신하고 드롭 다운에서 옵션을 풀거나 선택할 때 해당 알림을 보냅니다. 알림 처리기 코드 안에 단추 제목을 업데이트하십시오. –

+0

세 번째 VC는 포함되지 않은 별도의 VC입니다. – Rossco

+0

"왜 viewDidAppear가 실행되지 않는지 전혀 알지 못합니다." 나는 이것이 @ShawnFrank이 너에게 말한 것이라고 생각한다. – matt

답변

0

좋아, 그래서 난 내 원래의 코드는 아동 VC의 prepareforsegue에서 잘 줄 한 줄을 작동하는 것으로 나타났습니다.이에

 if segue.identifier == "unwindToStartVC"{ 

     let vc = segue.destination as! StartVC 
     vc.topBarReference?.CategoryFilterButton.titleLabel?.text = ((sender as! UIButton).titleLabel?.text)! 

    } 

: 나는으로부터 prepareforsegue을 변경하는 경우

 if segue.identifier == "unwindToStartVC"{ 

     let vc = segue.destination as! StartVC 
     vc.topBarReference?.CategoryFilterButton.setTitle((sender as! UIButton).titleLabel?.text, for: .normal) 

    } 

그것을 잘 작동합니다. .setTitle 메서드를 사용하는 이유는 모르겠지만 차이를 만드는 것 같습니다.

저에게 그것을 바꿀 아이디어를 준 Matt에게 감사드립니다. Matt의 방법은 내가 시도했을 때 작동했지만 Child VC가 아닌 Master VC에 풀기 때문에 코드 배치에 따라 코드를 편집해야했습니다.

내 작은 "발견"이 원래 코드의 가장 작은 변화와 같기 때문에 나는 이것을 답으로 표시 할 것입니다.

답변 해 주셔서 감사합니다.

0

다음과 같은 것이 있습니까?

enter image description here

그렇게하면, I가 사용되는 용액은 매우 간단하다 : 제 VC 임베디드 VC의 속성을 설정 prepareForSegue를 사용하고, 내장 VC가 unwind 방법에서는 그 특성을 픽업.

내 구현에서는 ViewController, ChildViewController 및 ThirdViewController라는 세 개의보기 컨트롤러가 있습니다. 이것은 전체 코드 (스토리 보드에 구성된 다른 모든 것들)입니다 :

class ChildViewController: UIViewController { 

    @IBOutlet weak var theButton: UIButton! 
    var buttonTitle : String? 

    @IBAction func unwind(_:UIStoryboardSegue) { 
     self.theButton.setTitle(self.buttonTitle, for: .normal) 
    } 

} 
class ThirdViewController: UIViewController { 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     (segue.destination as! ChildViewController).buttonTitle = (sender as! UIButton).currentTitle 
    } 

}