2012-10-10 4 views
1

OSX 개발을 처음 접했습니다. 이것을 첫 번째 앱으로 생각하십시오. 메인 윈도우에서 버튼을 클릭하면 시트를 표시하고 싶습니다.OSX에서 시트가 올바르게 표시되지 않습니다.

:

#import "MainViewObject.h" 
@implementation MainViewObject 

- (IBAction)accountButtonPressed:(id)sender { 
    [NSApp beginSheet:self.accountSheet 
    modalForWindow:[mainWindowView window] 
    modalDelegate:nil 
    didEndSelector:nil 
     contextInfo:nil]; 

[NSApp runModalForWindow:self.accountSheet]; 

[NSApp endSheet:self.accountSheet]; 
[self.accountSheet orderOut:self]; 
} 

- (IBAction)cancelSheetButtonPressed:(id)sender { 
// Return to normal event handling 
[NSApp endSheet:self.accountSheet]; 
// Hide the sheet 
[self.accountSheet orderOut:sender]; 
} 

을 다음과 같이 나는 다음 펜촉

을 사용하고하는 것은 내가 응용 프로그램을 실행할 때 나는 이런 식으로 뭔가를 얻을 수 .H 파일

#import <Foundation/Foundation.h> 
#import "WebKit/Webkit.h" 

@interface MainViewObject : NSObject 
- (IBAction)accountButtonPressed:(id)sender; 
- (IBAction)cancelSheetButtonPressed:(id)sender; 

하는 .m 파일에 대한 내 코드입니다 http://i.imgur.com/DzJJ6.png

나는 갇혀 있는데, 나는 이것에 무엇이 잘못되었는지 전혀 모른다. 시트를 가져올 수 없으며 앱을 종료 할 수도 없습니다. 나는 인터넷에서 몇 가지 예를 언급했다.

답변

1
- (IBAction)accountButtonPressed:(id)sender { 
    [NSApp beginSheet:self.accountSheet 
    modalForWindow:[mainWindowView window] 
    modalDelegate:nil 
    didEndSelector:nil 
     contextInfo:nil]; 

    [NSApp runModalForWindow:self.accountSheet]; 

    [NSApp endSheet:self.accountSheet]; 
    [self.accountSheet orderOut:self]; 

} 

와우, 그걸 보니 스크린 샷이 그대로 보입니다.

한 번에 한 줄씩 살펴 봅시다. 당신이 계정 버튼을 클릭하면, 당신은 연속적으로 즉시 4 일을하고 있습니다 :

  1. 당신은 당신의 메인 창에 부착 된 시트를 나타내는 시작 응용 프로그램을 말하는 것입니다. 이것은 정상이며 실제로는 accountButtonPressed: 메소드에서 원하는 유일한 코드입니다.

  2. 시트를 시작한 직후 응용 프로그램에 응용 프로그램 모달 방식으로 시트 자체를 표시하고 (모든 창에 연결되지 않고 화면 가운데에 표시되지 않음) 시트를 모두 표시하려는 경우 다른 모든 이벤트는 응용 프로그램에서 처리되지 않습니다. 즉,이 선은 실제로 의미가 없습니다. 창은 "문서 - 모달"방식 (시트가 부착 된 창을 묶는 방식)이나 "응용 프로그램 방식"방식으로 시트를 표시하지만 둘 다 동시에 표시하지는 않습니다. ;-)

  3. 방금 ​​시트를 본 직후에 NSApp에게 시트 표시를 중단하라고 지시합니다. 자, 이제 결국이 작업을하고 싶지만 방금 보여준 후에 0.0005 초 후에 시트를 닫으면 사용자가 조금 좌절 할 것입니다.

  4. 이제 시트를 숨기도록하십시오. 이 방법은 didEndSelector: 메서드에서 수행해야합니다.이 메서드는 첫 번째 메서드에서 문제를 발생시킵니다.

-

[NSApp beginSheet:self.accountSheet 
    modalForWindow:[mainWindowView window] 
    modalDelegate:nil 
    didEndSelector:nil 
     contextInfo:nil]; 

이 좋다뿐만 아니라 beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:Sheet Programming Topics: Using Custom Sheets 설명서를 읽어 보시기 바랍니다. (클래스 참조 페이지 상단의 컴패니언 가이드 링크는 실생활에서 API를 사용하는 방법을 배우는데 특히 도움이되며, 학습 당시 매우 도움이되었습니다.)

modalDelegate:nil을 지정하면 시트가 표시되지 않을 때까지 기다리는 것이 없습니다 (이는 [NSApp endSheet:sheet]로 전화 할 때 발생합니다). 또한 시트가 끝날 때 호출 할 @selector을 지정하지 않았습니다. 선택자는 일종의 함수, 일명 "메소드"와 같습니다.

귀하의 코드는 다음과 같이 보일 것입니다 :이 예에서는

@implementation MDAppDelegate 

- (IBAction)showSheet:(id)sender { 
    [NSApp beginSheet:self.sheet 
     modalForWindow:self.window 
     modalDelegate:self 
     didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:) 
      contextInfo:NULL]; 
} 

- (IBAction)cancel:(id)sender { 
    [NSApp endSheet:self.sheet]; 
} 

- (IBAction)ok:(id)sender { 
    [NSApp endSheet:self.sheet]; 
} 

- (void)sheetDidEnd:(NSWindow *)sheet 
      returnCode:(NSInteger)returnCode 
       contextInfo:(void *)contextInfo { 
    [sheet orderOut:nil]; 
} 
@end 

을, 당신은 쇼 시트 버튼을 클릭하고 시트는 메인 윈도우에 부착 된 표시되는 시작합니다. 시트에는 Cancel과 OK 버튼이 있으며, 각각의 메소드를 호출합니다. 각 방법에서 [NSApp endSheet:self.sheet]으로 전화하십시오. 그러면 NSApp에게 모달 대리자로 지정된 개체의 sheetDidEnd:returnCode:contextInfo: 메서드를 호출해야한다고 알립니다. sheetDidEnd:returnCode:contextInfo:에서 시트를 숨기라고합니다.

편집 :

모든 NSWindow은 인터페이스 빌더에 설정할 수있는 '가시 발사 "플래그가 있습니다. 이 플래그가 설정되면 nib 파일이로드 될 때 창이 표시됩니다. 설정되지 않은 경우 프로그래밍 방식으로 표시 할 때까지 창이 숨겨집니다. 표시처럼 그냥 nib 파일에 플래그를 편집 : 난 당신이 마지막에 제공 한 코드를 사용

enter image description here

+0

. 응용 프로그램을 실행했을 때 두 창이 모두 시트를 가져 오기 위해 버튼을 클릭하기 전에 표시된 것을 보았습니다. 다음은 동일한 http://i.imgur.com/XWNSk.png에 대한 스냅 샷입니다. – Nik

+0

처음에 시트 윈도우를 숨기는 방법에 대한 아이디어가 있습니다. 이전에 주석 링크에 표시된대로 bydefault open 시트를 닫으면, 그리고 잘 작동하는 버튼을 누르십시오. – Nik

+0

@Raj : updated 대답 – NSGod

관련 문제