2011-03-21 1 views
6

나는 NSView과 인스턴스 변수 NSImage * image;에서 상속 된 간단한 클래스 MyView을 가지고 있습니다. 클래스 기능은 뷰에 이미지를 그리는 것입니다. 이 함수 -init: 초기화되지 않은 경우 nilNSView 초기화 : -init : -awakeFromNib :

그러나 nil-drawRect: 화상 인스턴스 항상 동일, 그것은 -awakeFromNib: 초기화 된 경우. 로그에는 -init:-awakeFromNib: 함수가 한 번만 호출된다는 것을 보여줍니다.

-awakeFromNib: 기본적으로 GUI 구성 요소를 다시 초기화합니까?

답변

8

아니요. awakeFromNib에 대한 기본 구현은 없습니다.

문제는 사용자가 잘못된 초기화 방법을 무시하고 있다는 것입니다. NSViewdesignated initializerinitWithFrame:입니다. 하위 클래스의 일반 init이 호출되지 않으므로 image ivar이 아무 것도 가리 키지 않습니다.

awakeFromNib 또는 initWithFrame:에서 해당 ivar을 초기화 할 수 있습니다. 아무런 차이가 없습니다. 전자는 후자 (후자) 이후에 호출되며 사용자가 IBOutlets을 통해 펜촉의 다른 객체와 상호 작용해야하는 초기화 코드를 삽입 할 수있는 지점으로 제공됩니다.

+0

어떤 경우에는 '-initWithFrame' [가 전혀 호출되지 않습니다] (http://stackoverflow.com/questions/433539/initwithframe-not-called-but-awakefromnib-is). – jlstrecker

+7

사용자 정의 서브 클래스의'initWithFrame :'이 전혀 호출되지 않을 때 _one_ 경우 만 존재합니다 : IB 팔레트 (예 :'NSImageView')에있는 다른'NSView' 서브 클래스에서 상속 받았을 때, ID 관리자에서 클래스를 변경하여 사용자 정의 하위 클래스를 만듭니다. 이 경우, AppKit 서브 클래스의'initWithFrame :'_이 호출 될 것이고, 커스텀 서브 클래스는'awakeFromNib' 전에'initWithCoder :'를 얻을 것입니다. IB의 "Custom View"객체를 사용하여 뷰 인스턴스를 생성하면 뷰의'initWithFrame :'이 실제로 호출됩니다. –