创建一个完全自定义的NSAlert

8

是否可以创建完全自定义的警报框?我现在正在使用自定义窗口来执行此操作,但我希望有一个类似于- [NSAlert runModal] 的功能来阻止窗口。

我只想真正地改变背景和文本颜色,当然。


1
从技术上讲,如果以应用程序模态方式运行,则不能称其为“sheet”。 - JWWalker
一个带有自定义背景和文本颜色的应用模态警告框似乎可能会很糟糕。你真的需要这样做吗?你读过Mac人机界面指南吗? - Rob Keniger
真的一点也不讨厌。警报并不符合我的需求,因为我正在使用全屏应用程序并且正在使用NSStatusWindowLevel。我之前读过那些指南。 - Fatso
3个回答

6

关于推荐解决方案的警告:

此代码会导致浪费和无意义的开销:

for (;;) {
    if ([NSApp runModalSession:session] != NSRunContinuesResponse)
        break;
}

这段代码直接从苹果文档页面复制 - 但它旨在向开发人员展示可以插入有意义的后台执行代码的位置,而模态运行。也就是说,在break和闭合括号之间应该有一些代码。但是在示例中没有显示实际代码 - 这样运行只会导致您的应用程序重复轮询会话,直到结束。就像车后座上的两岁孩子问道,“我们到了吗?我们到了吗?我们到了吗?...”
如果您只想要简单明了的模态执行,即您的应用程序呈现一个模态窗口并暂停处理主/后台窗口,直到模态结束,请使用以下方法:
[NSApp runModalForWindow: self.window];

如果您想在窗口关闭时退出模态会话,请将以下代码添加到您的窗口控制器子类中:

- (void)windowWillClose:(NSNotification *)notification {
    [NSApp stopModal];
}

3
您需要一个自定义窗口,其中包含自定义视图绘制,但是NSAlert不允许您更改其窗口。因此,您将需要编写自己的窗口控制器子类,就像NSAlert一样(尽管NSAlertNSObject的子类)。

2

我找了一下,找到了这段代码:

NSModalSession session = [NSApp beginModalSessionForWindow:sheetWindow];
for (;;) {
    if ([NSApp runModalSession:session] != NSRunContinuesResponse)
        break;
}
[NSApp endModalSession:session];

我称之为

[NSApp stopModal]

结束会话。 现在我的代码更加简洁 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接