2011-11-10 5 views
0

현재 Titanium Appcelerator Desktop SDK에없는 느낌의 기능을 구현하여 objective-c를 배우고 있습니다 (사용자 정의와 함께 모달 대화 상자를 수행하는 방법). 버튼 텍스트를 표시하고 선택적으로 "시트"로 표시 할 수 있습니다.NSAlert (모달 시트로 표시)가 닫힐 때까지 차단

모두 멋지며 작동합니다. 그러나 NSAlert를 "시트"로 표시 할 때 경고를 생성하는 내 방법이 즉시 반환되며 이것이 내가 막으려 고하는 것입니다.

경고를 생성하는 메서드는 int (NSAlert의 반환 코드)를 반환합니다. modalDelegate가 필요 구현하는 것 객체입니다

int returnCode = -1; 
if (displayAsSheet) { 
    [alert beginSheetModalForWindow:nativeWindow modalDelegate:delegate didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:) contextInfo:nil]; 

} else { 
    returnCode = [alert runModal]; 
} 

return returnCode; 

:

- (void)alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; 

하고 지금은 그냥 반환 코드의 NSLog를 수행

코드는 내부에 기본적으로 요약된다.

그래서 제 질문은 : 가 하는 방법은 "시트"가 나타날 때까지 반환에서 내 방법을 차단할 수 있습니다

을 기각되었습니다?

아니면 잘못된 길로 가고 있습니까?

답변

4

시트를 보여준 후에 모달 세션을 시작하고 시트를 닫은 후에 세션을 중지해야합니다.

이것을 확인하십시오 : https://github.com/incbee/NSAlert-SynchronousSheet, 나는 그것이 도움이 될 것이라고 생각합니다.

+0

고마워요. 유! 이것은 내가 찾고 있었던 바로 그 것이었다. – Tomas

1

당신은 beginSheetModalForWindow:... 후이를 사용할 수 있습니다 시트가 해산 될 때까지

[[NSRunLoop mainRunLoop] runMode:NSModalPanelRunLoopMode beforeDate:[NSDate distantFuture]] 

그러나, 앱의 다른 윈도우를 사용할 수 없게됩니다. 이러한 창을 차단하지 않는 것이 좋습니다.

0

당신은 약간 잘못 생각하고 있습니다. 메소드가 시트가 끝날 때까지 기다릴 수 있으면 앱의 이벤트 루프가 차단되어 사용자가 UI와 상호 작용할 수있는 방법이 없습니다. 알림에 runModal을 사용하면 알림을 처리하기 위해 실행 루프가 생성되므로 앱에 다른 작업을 수행 할 수 없습니다. 시트 옵션의 요점은 경고가 표시되는 동안 사용자가 다른 작업을 수행 할 수있게하는 것입니다. 즉, 이 아닌 경우이 이벤트 처리를 대신받습니다.

어린이 창을 연결하여 시트를 위장 할 수 있습니다. 시트가 (= NO 세트 동결)를 제거 될 때까지 당신은 에 시도 할 수

0

는 앱에 고정 할 것을 정지 부울 (세트 동결 = YES) 을 설정합니다.
일반적으로 메서드를 차단할 필요가 없습니다. 사용자가 선택을해야만 몇 가지 일이 발생하기를 원할 것입니다.

예를 들어 자이로 스코프를 사용하는 앱이 있습니다. 그것에는 어떤 행동이 있고, 다른 행동에는없는 것입니다.
자이로 데이터를 사용하여 동작을 좋은 방법으로 라우팅하는 모든 메서드에 사용되는 부울이 있습니다. 내 useGyro 부울은 NO입니다. 사용자가 어떤 종류의 하드웨어 기능을 활성화할지 여부와 장치에서 자이로를 사용할 수없는 경우를 선택합니다.

MapView와 동일한 기능을 제공합니다. 사용자가 시스템에 연결하려고 할 때 사용자 위치를 사용하면 사용자 위치를 사용하여 동작을 멈출 수 있습니다.그가 선택을했을 때 나는 그 값을 바꾼다.

1
경고 수익을 만드는 것

내 방법 즉시

내가 @Josh 말한대로, 시트 창에만 상대 모달 실행되고있는가 연결된 때문에 그건 생각; 그것은 전체 애플 리케이션을 동결되지 않습니다. 따라서 beginSheetModal...이 실행 되 자마자 나머지 메서드는 사용자가 경고에 응답 할 때까지 기다리지 않고 return returnCode (여기에서 -1)으로 끝나며 계속 실행됩니다.

리턴 코드는 독립의 사용자 밀고 끝 경고 패널에있는 버튼입니다 (NSAlertFirstButtonReturn, NSAlertSecondButtonReturn 등 - 그들은 NSAlert 클래스 심판의 끝 부분에 나와있는). 사용자가 alertDidEnd 메서드에서이 매개 변수를 사용하여 사용자가 경고를 무시하기 위해 푸시 한 단추를 조작합니다. 이것이 alertDidEnd 셀렉터에 returnCode가 포함 된 이유입니다. 사용자가 경고를 일축 할 때이다 - 당신이 당신의 else 블록에서 runModal 방법을 사용하면 반면에

는, 당신은 명시 적으로 alertDidEnd를 호출하고 runModal 방법이 끝날 때 수를 반환 공급해야합니다.

int returnCode = -1; 
if (displayAsSheet) { 
    [alert beginSheetModalForWindow:nativeWindow modalDelegate:delegate didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:) contextInfo:nil]; 
    // The selector alertDidEnd has the returnCode int. The alert will then set that code to whatever the user chooses, and will send the altered int on to alertDidEnd. 
} 
else { 
    // Here, everything stops once runModal is called, until the user dismisses the alert, at which time the runModal method returns the int representing the button the user pushed, and you assign the return to your variable "returnCode." 
    returnCode = [alert runModal]; 
    [self alertDidEnd:alert returnCode:returnCode contextInfo:nil]; 
} 
// Omit the line returning the returnCode. 

그런 다음 alertDidEnd 방법은 이런 일을 수행합니다 : 여기

이 코드의 수정 된 버전입니다 그런데

- (void)alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo { 
switch (returnCode) { 
    case NSAlertFirstButtonReturn: 
     // Do whatever should happen when first button is pushed. 
     break; 
    case NSAlertSecondButtonReturn: 
     // Do whatever should happen when second button is pushed. 
     break; 
    default: 
     break; 
    } 
    // Unfreeze things. 
    [[NSApplication sharedApplication] stopModal]; 
} 

을이 시트를 실행하는 방법이 이며, 시트가 붙어있는 창뿐만 아니라 전체 앱을 고정시켜야합니다. modal tips

관련 문제