“退出”是使用按钮在Racket中退出gui应用程序的正确方法,还是其他最适合的方法?
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
NSString *stringUrl = [url absoluteString];
if ([stringUrl containsString:@"cancel"]) {
// Handle if user cancelled the login
[[NSNotificationCenter defaultCenter] postNotificationName:@"dropboxRegistrationCancel" object:self];
return NO;
}
if ([[DBSession sharedSession] handleOpenURL:url]) {
if ([[DBSession sharedSession] isLinked]) {
NSLog(@"App linked successfully!");
// At this point you can start making API calls
[[NSNotificationCenter defaultCenter] postNotificationName:ApplicationComeBackFromDropBoxLoginPage object:self];
}
return YES;
}
// Add whatever other url handling code your app requires here
return NO;
}
我发现DrRacket在使用退出按钮时给出了“禁止交互”警告消息,但在使用框架的[x]按钮关闭时有一个干净的退出。
我在此页面上找到了“退出”方法,但没有找到实际的退出方法:https://docs.racket-lang.org/gui/frame_.html?q=frame%25。 https://docs.racket-lang.org/reference/Exiting.html
也没有提及具体内容我相信以下声明只会隐藏框架而不会关闭应用程序:
(define myfr
(new frame% [label "myframe"] [width 100] [height 100] ))
(new message% [label "my gui app"][parent myfr])
(define exitbutton
(new button% [parent myfr] [label "Exit"]
[callback (lambda (b e) (exit) )]))
(send myfr show #t)
答案 0 :(得分:1)
exit
绝对是您希望结束应用程序的方式。但是,DrRacket中的REPL停止运行的原因是因为你的程序不再运行,即使你的程序中没有gui,也会在你调用exit时发生。
你也是对的:
(send myfr show #f)
会隐藏窗口但实际上不会退出应用程序。
因此,您可以做的一件事是尝试测试您是否在DrRacket中运行。如果你是,而不是退出程序,只需关闭窗口,让DrRacket在用户点击kill或启动新程序后退出应用程序。
问题在于,通常无法检测您是否在沙箱中运行。你可以用一些黑客来测试它,但它不是很强大:
Determin if a racket program is in a sandbox
另一种方法是创建自己的沙箱,并在该沙箱中运行程序(这就是DrRacket实际运行代码的方式)。然后,当您的程序退出时,仍然会有一个可用的repl。虽然请注意,repl将用于沙箱本身,而不是它所在的repl。
的文档答案 1 :(得分:1)
Leif已经完全解释了这一点,但我只是想以更新手的观众来形容它。
" gui application"你提到的问题可能意味着不同的东西,这取决于你运行该代码的位置。
如果从DrRacket REPL运行,则lambda(exit)将退出REPL(导致"禁用交互"消息)。如果此代码是由racket可执行文件运行的脚本(例如,从命令行),它将退出该脚本/ shell(可能是您想要的)。
我不确定您是否想要尝试退出代码,如果您在沙盒或REPL中并且在每个环境中单击退出按钮时表现不同,但Leif还指出了答案它也是。
在Leif的回答中写这个不必要的补充的另一个原因是,我想指出你的术语" gui application"。如果我听起来很光顾,我很抱歉。在您的应用程序中显示gui框架或其他图形界面是您选择使用的功能,并且不会使应用程序有所不同。与操作系统的观点的一个区别是与顶级框架/窗口相关联的回调函数。并且这个回调函数非常好(很可能 - 尽管我没有检查球拍代码的细节),在我们的案例中由语言注册和处理。所以我想说 - 显示一个gui与否我会认为它们是相同的,它会在你打电话(退出)时退出。并且通常(可能)框架的x按钮将默认隐藏它(因为您已经知道,因此您添加了退出lambda函数)。您的应用程序可以在应用程序生命周期内取消隐藏它。