iOS6에서 새로운 컨테이너보기를 발견했지만 포함보기에서 컨트롤러에 액세스하는 방법을 잘 모르겠습니다.
대본:
컨테이너보기가있는보기 컨트롤러에서 경고보기 컨트롤러의 레이블에 액세스하고 싶습니다.
그들 사이에 segue가 있는데, 그것을 사용할 수 있습니까?
답변
예. segue를 사용하여 하위 뷰 컨트롤러 (및 해당 뷰 및 하위 뷰)에 액세스 할 수 있습니다. alertview_embed
스토리 보드의 속성 관리자를 사용하여 segue에 식별자 (예 :)를 제공하십시오 . 그런 다음 부모보기 컨트롤러 (컨테이너보기를 수용하는 컨트롤러)에게 다음과 같은 방법을 구현하십시오.
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
NSString * segueName = segue.identifier;
if ([segueName isEqualToString: @"alertview_embed"]) {
AlertViewController * childViewController = (AlertViewController *) [segue destinationViewController];
AlertView * alertView = childViewController.view;
// do something with the AlertView's subviews here...
}
}
답변
당신은 단순히 다음과 같이 할 수 있습니다 self.childViewControllers.lastObject
(자녀가 하나 있다고 가정하면 그렇지 않으면 사용하십시오 objectAtIndex:
).
답변
스위프트 프로그래밍
이렇게 쓸 수 있습니다
var containerViewController: ExampleViewController?
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// you can set this name in 'segue.embed' in storyboard
if segue.identifier == "checkinPopupIdentifierInStoryBoard" {
let connectContainerViewController = segue.destinationViewController as ExampleViewController
containerViewController = connectContainerViewController
}
}
답변
이 prepareForSegue
접근 방식은 작동하지만 segue 식별자 매직 문자열을 사용합니다. 더 좋은 방법이있을 수 있습니다.
VC의 클래스를 알고 있다면 계산 된 속성으로 매우 깔끔하게 수행 할 수 있습니다.
var camperVan: CamperVanViewController? {
return childViewControllers.flatMap({ $0 as? CamperVanViewController }).first
// This works because `flatMap` removes nils
}
에 의존합니다 childViewControllers
. 첫 번째 수업에 의존하는 것은 깨지기 쉬울 수 있지만 동의하는 수업의 이름을 지정하면 이것이 상당히 견고 해 보입니다.
답변
계산 된 속성을 사용하여 Swift 3에 대한 업데이트 된 답변 :
var jobSummaryViewController: JobSummaryViewController {
get {
let ctrl = childViewControllers.first(where: { $0 is JobSummaryViewController })
return ctrl as! JobSummaryViewController
}
}
이는 첫 번째 일치 항목에 도달 할 때까지 하위 목록 만 반복합니다.
답변
self.childViewControllers
부모의 통제가 필요할 때 더 관련이 있습니다. 예를 들어 자식 컨트롤러가 테이블보기이고이를 강제로 다시로드하거나 부모 탭 컨트롤러의 다른 이벤트 또는 버튼 탭을 통해 속성을 변경하려는 경우에는 PrepareForSegue가 아닌 ChildViewController의 인스턴스에 액세스하여이를 수행 할 수 있습니다. 둘 다 다른 방식으로 응용 프로그램을 가지고 있습니다.
답변
뷰 컨트롤러의 유형에 Swift의 switch 문을 사용하는 다른 방법이 있습니다.
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
switch segue.destination
{
case let aViewController as AViewController:
self.aViewController = aViewController
case let bViewController as BViewController:
self.bViewController = bViewController
default:
return
}
}