gpt4 book ai didi

objective-c - 等到首选项 Pane 完全可见才能显示工作表?

转载 作者:行者123 更新时间:2023-12-03 17:36:59 25 4
gpt4 key购买 nike

我正在编写一个首选项 Pane 来控制我创建的脚本,并且我想在首次启动时显示一个工作表,以便用户可以告诉该 Pane 他们安装脚本的位置。该工作表看起来很好,问题是它在您单击我的 Pane 的按钮后立即出现。这会立即导致系统偏好设置出现段错误。

我正在使用该命令显示 awakeFromNib 内的工作表,这可能与它有关,但我无法让 mainViewDidLoad 内的任何内容实际执行。关于我能做什么有什么想法吗?

代码:

- (void) awakeFromNib
{
NSLog(@"hi");
[sheetController setParentWindow:[NSApp mainWindow]];
BashScript *script = [[BashScript alloc] init];
if (![script loadScriptFromLocation:[self retrieveScriptLocation]])
{
NSLog(@"Error loading script.");
}
else {
[advancedEditor setString:[script getScript]];
}
}


- (NSString*) retrieveScriptLocation
{
NSUserDefaults *preferences = [[NSUserDefaults standardUserDefaults] retain];
NSString *location = [preferences stringForKey:@"scriptLocation"];
if (location != nil)
{
return location;
}
else
{
return [self askForScript];
}
}

- (NSString*) askForScript
{
[sheetController openSheet:nil];
}

编辑:这是崩溃的堆栈跟踪:http://files.spherecat1.com/prefpanestacktrace.txt

最佳答案

堆栈跟踪揭示了崩溃的原因:

- (void) awakeFromNib
{
if (![script loadScriptFromLocation:[self retrieveScriptLocation]])

- (NSString*) retrieveScriptLocation
{
return [self askForScript];

- (NSString*) askForScript
{
[sheetController openSheet:nil];
}

您尚未从已声明为返回值的该方法返回值。编译器应该对此发出警告。

发生崩溃是因为该方法返回了返回值应在的有效随机字节(可能是有效的对象指针,也可能不是)。通过查看堆栈跟踪中尝试的消息,您可以知道此返回值应该是一个字符串:

Application Specific Information:
objc_msgSend() selector name: getFileSystemRepresentation:maxLength:

这是一个 NSString 方法,因此在本例中,-[NSData initWithContentsOfFile:]-[NSFileManager contentAtPath:] 背后的实现尝试处理地址作为 NSString 的地址。事实并非如此,这就是导致崩溃的原因,因为您没有从您所说的方法中返回字符串。

当然,您不能只让该方法返回一个字符串,因为您还没有返回它。您需要重构代码以反射(reflect)“打开”面板和工作表的异步性质。认识到您还没有字符串,并且在一分钟或多分钟内不会;只需开始打开面板表,在成功之前不要尝试加载脚本。

简而言之,尝试加载脚本,如果还没有路径,只需开始打开面板表,然后继续进行其他初始化。

您也不应该假设“打开”面板会成功。用户可以取消,特别是如果这是他们第一次打开预制面板并且他们想先四处看看。事实上,您不应该在预 Pane 加载时立即显示“打开”面板。

相反,应该有一个文件选择器 View ,显示当前脚本的位置(如果有的话),并通过其位置和其下方的解释性文本以及可能明智的颜色应用来明确表明,除非用户使用,否则您的程序无法运行选择一个脚本。让用户选择脚本,从而在他们准备好时启用您的程序。

关于objective-c - 等到首选项 Pane 完全可见才能显示工作表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2299394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com