2010-03-11 1 views
5

아래의 코드에서 CustomWindow는 NSWindow의 하위 클래스입니다. 당신이 그렇게로드는 같은 NSWindow 표시를 (내가 XIB 내부에있는 직렬화를 의미)을 중심으로 일을 할 수 후로드 한 후 NSWindow Xib의 포인터?

CustomWindow *window = [[CustomWindow alloc] init]; 
if (![NSBundle loadNibNamed:@"NibName" owner:window]) 
[window center]; // doesn't work 

어떻게 포인터가 당신의 XIB를 제어하기 위해 어떻게해야합니까?

여기서 내가 뭘 잘못하고 있니?

답변

16

NSWindowController 하위 클래스를 사용해야합니다. NSWindowController은 달성하고자하는 것을 정확하게 수행하도록 특별히 설계되었으며, NSBundle의 방법을 사용하여 펜촉을 직접로드하면 실행할 몇 가지 문제를 해결합니다. 일반적으로 항상 창을 관리하려면 NSWindowController 하위 클래스를 사용해야합니다.

것은 NSWindowController의 서브 클래스를 생성합니다

인터페이스 빌더에서
@interface MyWindowController : NSWindowController {} 
@end 

@implementation MyWindowController 
- (id)init 
{ 
    self = [super initWithWindowNibName:@"MyWindow"]; 
    if(self) 
    { 
     //initialize stuff 
    } 
    return self; 
} 
//this is a simple override of -showWindow: to ensure the window is always centered 
-(IBAction)showWindow:(id)sender 
{ 
    [super showWindow:sender]; 
    [[self window] center]; 
} 
@end 

MyWindowController을하고 당신의 펜촉의 창 개체에 파일의 소유자window 콘센트를 연결하는 파일의 소유자의 클래스를 설정합니다.

그런 다음 이렇게하여 창을 표시 할 수 있습니다

아래에있는 내 코드에서
MyWindowController* controller = [[MyWindowController alloc] init]; 
[controller showWindow:self]; 
+0

"File Owner의 창 콘센트에 연결"을 제외하고 나는 당신이 이미 말한 모든 것을하고있었습니다. 일단 내가 그 모든 일을했다. 무리 감사! +1하고 똑딱. –

+0

IB의 'Restorable'속성의 선택을 취소하십시오. –

+0

@KeithSmiley 어떤 편집기가'Restorable' 속성입니까, 아니면 더 이상 Xcode 5.x에 적용되지 않습니까? –

1

아마도 파일 소유자로 만들고 싶지 않을 것입니다. 일반적으로 self 또는 일부 컨트롤러 개체를 전달합니다. 그런 다음 self 또는 해당 컨트롤러 개체에 CustomWindow IBOutlet이있는 경우 loadNibNamed:으로 전화하면 연결됩니다. 예제 코드는 this post을 확인하십시오.

+0

CustomWindow는 컨트롤러 개체입니다. 여기에는 애플리케이션을 실행할 때 연결되는 IBOutlet이 포함되어 있습니다. 창에있는 컨트롤이 모두 작동합니다. 중심에 두는 방법을 알아낼 수 없습니다. –

0

XIB는 개체의 컨테이너이며 창과 같지 않습니다. XIB를 센터링 할 수는 없으며 XIB에 포함 된 창만 센터링 할 수 있습니다.

또한로드 할 때 XIB의 개체가 만들어집니다. XIB의 개체 중 하나를 소유 한 개체를 소유자로 전달하지 않고 대신 IBOutlet을 사용하여 XIB를로드 할 때 생성 된 새 개체에 대한 참조를 가져온 다음 상호 작용할 수 있습니다.

파일 소유자 개체는 XIB의 특수 개체입니다.이 개체는 만들지 않고 loadNibNamed:owner:에 전달하여 지정할 수있는 유일한 개체이기 때문에 XIB에서는 특수 개체입니다. XIB에서 만든 개체와 응용 프로그램 사이의 통로입니다.

일반적으로 소유자 개체는 일종의 컨트롤러 클래스입니다. Interface Builder에서 File Builder의 소유자 클래스를 컨트롤러 클래스로 설정 한 다음 클래스에서 일부 IBOutlet을 정의하면 파일 소유자의 Interface Builder에 나타나고 XIB의 객체를 해당 클래스에 연결할 수 있습니다.

마지막으로 컨트롤러 개체를 loadNibNamed:owner:으로 전달하면 코코아가 IBOutlet을 새로 생성 된 개체에 연결하고 해당 개체와 상호 작용할 수 있습니다. 귀하의 XIB에 창을 센터링합니다.

+0

이미 설정 한 내용을 설명합니다. IBOutlets에는 문제가 없으며 XIB에 대한 포인터를 얻으려고하지 않습니다. XIB에는 NSWindow가 포함되어있어서 포인터를 –

+0

에두고 싶습니다. IB에서 "File 's Owner"를 사용하고 있습니다. loadNibNamed : 메소드에 전달하는 객체의 프록시입니다. 다른 대답을 참조하십시오. –

+0

네, 그래요. 파일의 소유자 창 콘센트가 XIB의 창 개체에 연결되어 있지 않다는 것이 문제였습니다. –

2

는 CustomWindow는 NSWindow 표시의 서브 클래스입니다.

CustomWindow *window = [[CustomWindow alloc] init]; 
if (![NSBundle loadNibNamed:@"NibName" owner:window]) 
[window center]; // doesn't work 

당신은 어떻게 그렇게로드는 같은 XIB 내부의 NSWindow 표시를 중심으로 일을 할 수 후 포인터가 당신의 XIB를 제어하기 위해 어떻게해야합니까?

"는 XIB 내부 NSWindow 표시를 중심으로하는"당신이 XIB 내부에있는 NSWindow 표시 객체,이 경우, 당신은 왜 만드는 중심을 의미하지 않는 한 아무 의미가, (화면에 그것을 중심 없을 것)한다 다른 NSWindow (CustomWindow) 객체가 xib 외부에 있습니까?

펜촉 (또는 xib)은 개체의 보관 파일입니다. 펜촉에있는 창을 사용하려면 해당 창을 가리 키도록 콘센트를 만들고 콘센트를 추가 한 클래스로 File Owner 클래스를 설정하고 콘센트를 연결합니다. IB를 호출하고 owner: 인수에 전달하여 파일 소유자로 콘센트가있는 객체를 지정합니다. 그 객체는 소유자로서 창에 대한 작업을 담당하게됩니다. 펜촉을로드하는 동일한 객체 (일반적으로 내 코드에서) 일 수 있습니다.

또한 init은 NSWindow에서 작동하지 않습니다. initWithContentRect:styleMask:backing:defer: 또는 initWithContentRect:styleMask:backing:defer:screen:을 사용해야합니다. init을 사용하면 CustomWindow에서 직접 init을 구현하고 [super init…] 메시지에 대해이 두 선택기 중 하나를 사용하는 경우에만 유효합니다.