[xcode] IBOutlet이 nil이지만 스토리 보드 인 Swift에 연결되어 있습니다.

Swift 1.1 및 Xcode 6.2 사용.

단일 사용자 지정 UIViewController하위 클래스가 포함 된 UIStoryboard가 있습니다. 여기에 해당 컨트롤러 에서 스토리 보드 의 하위 클래스@IBOutlet연결되는 유형이 UIView있습니다 . 또한 해당 뷰의 하위 뷰에 대한 유사한 콘센트가 있습니다. 그림 A를 참조하십시오.UIView

그러나 런타임에는 이러한 속성이 없습니다 (그림 B). 나는 Interface Builder에서 콘센트를 연결했다고 확신했지만.

생각 :

  • 하위 클래스의 하위 클래스를 사용하고 있기 때문에 초기화가 엉망이 될 수 있습니까? 이니셜 라이저를 재정의하지 않습니다.
  • awakeFromNib: 어떤 이유로 전화를받지 않습니다
  • 아마도 하위보기의 하위보기에 연결되지 않을 수 있습니다.

내가 시도한 것 :

  • @IBOutlet정확히 일치 및 스토리 보드 항목 유형 (대신 UIView)
  • 속성 및 콘센트를 삭제하고 다시 추가했습니다.

그림 A

그림 A *

그림 B

그림 B

* 가려진 코드 Figure A는 다음과 같습니다.

@IBOutlet private var annotationOptionsView: UIView!
@IBOutlet private var arrivingLeavingSwitch: UISegmentedControl!

감사합니다.



답변

일반적으로 이것은 뷰 컨트롤러가 아직 뷰 계층 구조를로드하지 않았기 때문에 발생합니다. 뷰 컨트롤러는 view메시지를 보낼 때만 뷰 계층을로드 합니다. 실제로 같은 것들 후 발생하는 화면에 뷰 계층을 넣어 시간 때 시스템은이 작업을 수행 prepareForSegue:sender:하고 viewWillAppear:돌아왔다가.

VC가 아직 뷰 계층 구조를로드하지 않았기 때문에 아울렛은 여전히 ​​nil입니다.

을 말하여 VC가 뷰 계층 구조를로드하도록 할 수 _ = self.view있습니다.


답변

제품> 청소를 실행 해 보셨습니까? 저에게 매우 유사한 문제를 해결했습니다.


답변

Storyboard 또는 NIB에서 뷰 컨트롤러를 인스턴스화 했습니까? 아니면 이니셜 라이저를 통해 직접 인스턴스화 했습니까?

이니셜 라이저를 사용하여 클래스를 직접 인스턴스화하면 콘센트가 연결되지 않습니다. Interface Builder는 클래스의 사용자 정의 인스턴스를 생성하고 반복 디코딩을 위해 해당 인스턴스를 NIB 및 스토리 보드로 인코딩합니다. 클래스 자체를 정의하지는 않습니다. 이것이 문제라면 컨트롤러를 만드는 코드를 변경하여 UIStoryboard 또는 UINib의 메서드를 대신 사용하면됩니다.


답변

스토리 보드는 내가 추가 한 추가 UI를 인식하지 못했습니다. 런타임에 모든 참조는 nil이었습니다. 그래서 파생 데이터 폴더를 지운 다음 해당 연결이 다시 작동했습니다.


답변

이것은 내 사용자 지정 컬렉션 뷰 셀에서 나에게 발생했습니다. registerClassforReuseIdentifier 메서드를 registerNib로 바꿔야했습니다. 그것은 나를 위해 그것을 고쳤습니다.


답변

이것은 스토리 보드를 통해 인스턴스화하는 대신 실수로 뷰 컨트롤러를 직접 인스턴스화했기 때문에 발생했습니다. 직접 인스턴스화 MyViewController()하면 콘센트가 연결되지 않습니다.


답변

제 경우에는 loadViewViewController 하위 클래스 의 메서드를 재정의 했지만 추가하는 것을 잊었 기 때문에 발생했습니다.[super loadView]

-(void)loadView {
// blank
}

loadView메서드 를 재정의 할 때 하위보기를 초기화하는 것은 사용자의 책임입니다. 이를 재정의하기 때문에 인터페이스 빌더의 뷰는 코코아 개체로 변환 할 기회를 얻지 못하므로 콘센트가 nil로 유지됩니다.

뷰 컨트롤러 하위 클래스에서 loadView를 구현하면 스토리 보드 / xib에서 코드로 UI 요소를로드하는 것이 사용자의 책임이됩니다.

아니면 그냥 전화

[super loadView];

그래서 슈퍼 클래스가 스토리 보드 / xib를 코드에로드 할 기회를 얻습니다.