상위 iOS에서 컨테이너 보기 컨트롤러에 액세스
iOS6에서는 새로운 Container View를 보았지만 Containing View에서 컨트롤러에 액세스하는 방법을 잘 모르겠습니다.
시나리오:
컨테이너 뷰를 포함하는 뷰 컨트롤러에서 경고 뷰 컨트롤러의 라벨에 액세스하고 싶다.
그 사이에 세구가 있는데, 그걸 써도 될까요?
예, segue를 사용하여 하위 보기 컨트롤러(및 해당 보기 및 하위 보기)에 액세스할 수 있습니다.segue에 식별자를 지정합니다(예:alertview_embed
)를 사용합니다.그런 다음 상위 뷰 컨트롤러(컨테이너 뷰를 수용하는 컨트롤러)가 다음과 같은 방법을 구현하도록 합니다.
- (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
(자녀가 1명밖에 없는 경우, 그렇지 않은 경우,objectAtIndex:
).
Swift Programming용
이렇게 쓸 수 있어요.
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
}
}
다음과 같은 코드를 사용합니다.
- (IBAction)showCartItems:(id)sender{
ListOfCartItemsViewController *listOfItemsVC=[self.storyboard instantiateViewControllerWithIdentifier:@"ListOfCartItemsViewController"];
[self addChildViewController:listOfItemsVC];
}
스위프트 3.0을 찾는 사람이 있다면
그러면 viewController1, viewController2 등에 액세스할 수 있습니다.
let viewController1 : OneViewController!
let viewController2 : TwoViewController!
// Safety handling of optional String
if let identifier: String = segue.identifier {
switch identifier {
case "segueName1":
viewController1 = segue.destination as! OneViewController
break
case "segueName2":
viewController2 = segue.destination as! TwoViewController
break
// ... More cases can be inserted here ...
default:
// A new segue is added in the storyboard but not yet including in this switch
print("A case missing for segue identifier: \(identifier)")
break
}
} else {
// Either the segue or the identifier is inaccessible
print("WARNING: identifier in segue is not accessible")
}
제네릭을 사용하면 달콤한 일을 할 수 있습니다.다음은 어레이의 확장입니다.
extension Array {
func firstMatchingType<Type>() -> Type? {
return first(where: { $0 is Type }) as? Type
}
}
그런 다음 viewController에서 다음을 수행할 수 있습니다.
var viewControllerInContainer: YourViewControllerClass? {
return childViewControllers.firstMatchingType()!
}
이렇게 쓸 수 있어요.
- (IBAction)showDetail:(UIButton *)sender {
DetailViewController *detailVc = [self.childViewControllers firstObject];
detailVc.lable.text = sender.titleLabel.text;
}
}
언급URL : https://stackoverflow.com/questions/13279105/access-container-view-controller-from-parent-ios
'programing' 카테고리의 다른 글
스크립트의 인수를 사용하여 두 번째 스크립트 호출 (0) | 2023.04.12 |
---|---|
폴더가 아직 존재하지 않는 경우에만 일괄 처리가 포함된 폴더 만들기 (0) | 2023.04.12 |
"Foundation_export" vs "extern" (0) | 2023.04.12 |
WPF에서의 버튼 플랫스타일 설정 (0) | 2023.04.12 |
SQL Server에서 특정 테이블을 참조하는 모든 외부 키를 나열하려면 어떻게 해야 합니까? (0) | 2023.04.07 |