【问题标题】:OS X NSAlert window won't close in xCode 8 in Objective-COS X NSAlert 窗口不会在 Objective-C 的 xCode 8 中关闭
【发布时间】:2016-10-12 20:31:03
【问题描述】:

我在 xCode 7 中使用以下方法来显示警报/错误。我知道 alertWithMessageText 现在已被弃用。如果我在 xCode 8 中使用此方法(尽管已弃用),则当用户按下 Ok 按钮时窗口不会关闭。我查看了几十篇文章,用 beginSheetModalForWindow:completionHandler: 方法替换它,但无法让它工作。一些示例代码将不胜感激。

( 我在运行 xCode 7 方法时收到以下控制台消息: 2016-10-12 15:35:23.537072 eBuyBooks[7886:2192964] [布局] 检测到 .无法放置,因为没有足够的约束来完全定义大小和原点。添加缺少的约束,或设置 translatesAutoresizingMaskIntoConstraints=YES 并且将为您生成约束。如果此视图在 macOS 10.12 及更高版本上手动布局,您可以选择不从覆盖中调用 [super layout]。在 DETECTED_MISSING_CONSTRAINTS 上设置断点进行调试。此错误只会记录一次。)

// in Header file
NSAlert * alertWithOkButton;

.....

// in implementation file
- (void)errorPopUp:(NSString *)reason detail:(NSString *)detail {

    alertWithOkButton = [NSAlert alertWithMessageText:reason
                                        defaultButton:@"Ok"     
                                      alternateButton:nil       
                                          otherButton:nil       
                            informativeTextWithFormat:@"%@",detail];

    [alertWithOkButton runModal];    
}

【问题讨论】:

  • beginSheetModalForWindow:completionHandler:runModal 的替代品,runModal 并未被弃用。
  • alertWithMessageText 的替换在文档中:“相反,分配并初始化一个 NSAlert 对象并根据需要设置其属性。”

标签: xcode cocoa xcode8 nsalert


【解决方案1】:

试试这个作为替代品,它不被弃用:

// in implementation file
- (void)errorPopUp:(NSString *)reason detail:(NSString *)detail {
        NSAlert *alert = [[NSAlert alloc] init];
        [alert setMessageText:reason];
        [alert setInformativeText:detail];
        [alert setAlertStyle:NSCriticalAlertStyle]; // or NSWarningAlertStyle, or NSInformationalAlertStyle
        [alert addButtonWithTitle:@"OK"];

        [alert runModal];
}

要设置符号断点,请转到断点导航器(项目窗口左上角的小轮廓箭头),单击窗口左下角的“+”,选择“符号断点”并输入DETECTED_MISSING_CONSTRAINTS for符号。

如果断点被命中,您可以在调试器视图中输入po $arg1 以打印错过约束的视图的描述。

【讨论】:

  • 太棒了!工作!仍然得到这个控制台消息:code2016-10-14 16:06:13.664282 eBuyBooks[24614:6627678] [Layout] 检测到 缺少约束。无法放置,因为没有足够的约束来完全定义大小和原点。添加缺少的约束,或设置 translatesAutoresizingMaskIntoConstraints=YES 并且将为您生成约束。如果此视图在 macOS 10.12 及更高版本上手动布局,您可以选择不从覆盖中调用 [super layout]。在 DETECTED_MISSING_CONSTRAINTS 上设置断点进行调试。此错误只会记录一次。
  • 那么我会说这个错误来自其他地方。尝试在 DETECTED_MISSING_CONSTRAINTS 上设置断点,就像错误所说的那样。
  • 当 [alert run modal] 行执行时出现该消息。在试图弄清楚如何在 DETECTED_MISSING_CONSTRAINTS 上放置断点时,我看到了 Apple 技术说明:developer.apple.com/library/content/technotes/tn2124/…。它很长而且很复杂,我不知道如何放置断点。此外,它是否可能只是指向 NSAlert 窗口?如果是这样,我还在 NSAlert 文档中搜索了可能解决此约束问题的任何属性或方法。我尝试了几个,包括 initWithFrame:NSMakeRect(...) 但没有一个解决错误消息。
  • 我添加了有关如何为我的答案设置断点的信息。但这个问题可能是 macOS 10.12 的错误。见stackoverflow.com/questions/39852109/…
  • 我发现了问题!我将一个 NULL NSString 指针传递给详细参数([alert setInformativeText:detail]。那是在绘制约束警告。线索是在我断点 DETECTED_MISSING_CONSTRAINTS 之后,我在堆栈跟踪中看到最后一行是一个错误NSTextField 和图形自动布局创建了必要的 NSTextFields。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-19
  • 2017-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多