IBOutlet 에 대한 링크를 포함 보기 컨트롤러
-
12-12-2019 - |
문제
나는 복잡한 아이 패드록을 관리함으로써 여러 가지 볼 수 있습니다.나는 이전에(전 iOS6/XCode4.5)이런 짓을 할당하여 내보기 컨트롤러 코드에서와 엮은 다양한 전망하지만 그들을 링크하는 마스터 보기입니다.
내가 무엇을 하고 싶은 사용하여 새로운 컨테이너망을 포함합 보기 컨트롤러 스토리 보드에서 파일입니다.나는 것 같다하지 않을 만들 수 있는 IBOutlet 에 대한 링크를 포함된 뷰 컨트롤러 마스터 컨트롤러입니다.
이 가능합니까?나를 검색하는 임베디드 컨트롤러를 통해 태그나 뭔가 코드에서?
이 질문에 대해 구체적으로 사용하여 컨테이너 뷰
해결책
나는 "임베디드 컨트롤러를 검색"한 것을 확신하지 못합니다.컨트롤러를 사용하려는 경우 UistoryBoard 메서드 인스턴트 AtteiveViewControllerWithIdentifier ViewsControllerWithIdentifierVy를 사용합니다.PerfectSegueWithIdentifier를 사용할 수도 있습니다. Sender : Method (View Controller를 인스턴스화하는).Apple 문서의 앱에서 "앱에서 View Controllers 사용"섹션을 확인해야합니다.또한 자식 뷰 컨트롤러가 컨테이너 컨트롤러와 동시에 인스턴스화되는 사실을 참조합니다.
편집 후 : 다른 뷰 컨트롤러에 컨테이너보기를 삽입하는 경우 셀프 .ChildViewControllers (배열이 될 수 있으므로) 포함 된 컨트롤러에서 임베디드 뷰 컨트롤러를 참조 할 수 있습니다.LastObject와 함께).
다른 팁
또 다른 옵션에 대한 몇 가지 사례를 캡처하는 임베디드 컨트롤러 사용 -prepareForSegue:sender:
.
예를 들어,이 있는 경우 UINavigationController
에 포함된 CustomContainerViewController
, 수 이름을 포함 segue embedContentStack
스토리보드 및에서 캡처 CustomContainerViewController
via
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"embedContentStack"]) {
// can't assign the view controller from an embed segue via the storyboard, so capture here
_contentStack = (UINavigationController *)segue.destinationViewController;
}
}
여기에 대한 또 다른 스레드는 다음과 같습니다. 부모 iOS에서 컨테이너보기 컨트롤러 액세스/ a>
주의 참고
을 진행하기 전에 사용하는 이 질문에 대답할 수 있습을 반영하는지 여부를 포함 된 것은 정말 필요할 보기 컨트롤러입니다.
예를 들어,당신은 포함 UICollectionViewController
서브 클래스,수 당신이 대신에 포함 UICollectionView
서브 클래스는?또는,더 나은,당신은 포함 UIView
서브 클래스는 것을 숨기고 UICollectionView
뒤에 간단한 뷰 모델?
코드 베이스 나는 현재 작업에,나는 포함하 두 개의 보기 컨트롤러에서 또 다른 볼 컨트롤러입니다.모두 비교적 쉽게 될 전망 대신할 수 있는 더 쉽게 바 스토리보드에서 이없이 지저분한 코드입니다.
불행하게도,그들은 현재 보기 컨트롤러와 나에서 위치를 간소화하에서 일반 뷰 지금,그래서 이해야 할 것입니다.
배경
내가 사용하여 접근 방식이 선정한 최고의 포함에 segue prepare(for segue:, sender:)
에 의해 제안 장난 괴짜 여기에.
을 보여주고 싶었 swift 나는 이것을 사용하고 있습니다,그것을 상당히 깔끔한...
class EditionLandingViewController: UIViewController {
fileprivate var titlesView: SectionTitlesViewController!
fileprivate var sectionsView: SectionsViewController!
}
//MARK:-
extension EditionLandingViewController {
private enum SegueId: String {
case embedTitles
case embedSections
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
super.prepare(for: segue, sender: sender)
guard
let segueRawId = segue.identifier,
let segueId = SegueId(rawValue: segueRawId)
else { return }
switch segueId {
case .embedTitles:
self.titlesView = segue.destination as! SectionTitlesViewController
case .embedSections:
self.sectionsView = segue.destination as! SectionsViewController
}
}
}
토론
나는 선택 이름 segues 으로 동작 방법.
를 사용하는 enum
에 대한 사례연스럽게 식별자의 의미를 컴파일러 및 장식새김 귀하의 측면에서,그래서 얻을 훨씬 어렵 segue 이름 잘못입니다.
유지 segue id private enum
내 extension
범위를 보 이 경우에 해당으로 이러한 segues 되지 않은 다른 곳에서는 필요(그들은 수 없습니다 perform
ed,예를 들어).
내가 사용하는 암시적으로 풀어 유형을 위한 임베디드 뷰 컨트롤러기 때문에(나의 케이스에서 어쨌든)그것은 논리에 오류가 있다면 그들은 없습니다.
마찬가지로,나도 행복을 강제로 캐스팅 대상 보기 컨트롤러는 형식입니다.다시,그것은 논리 오류는 경우 이러한 형식이 동일하지 않습니다.