NSAlert окно изменения размера

У меня есть несколько диалогов NSAlert с разным текстом. Я хочу настроить ширину окна предупреждения в соответствии с текстом, чтобы текст не переносился. Поэтому я использую этот код для вычисления ширины строки:

NSSize size = [myString sizeWithAttributes:@{NSFontAttributeName: [NSFont systemFontOfSize:[NSFont systemFontSize]]}];

Затем я пытаюсь настроить окно оповещения:

NSAlert *alert = [NSAlert alertWithMessageText:...
...
NSPanel *panel = alert.window;
NSRect frame = panel.frame;
float x = ((NSTextField*)[[((NSPanel*)(alert.window)).contentView subviews] objectAtIndex:5]).frame.origin.x;    //the x-position of the NSTextField
frame.size.width = size.width + x;
[alert.window setFrame:frame display:YES];

Этот код работает, но я впервые вызываю метод с этим кодом. Если я возьму другую строку и снова вызову метод, размер окна не изменится (хотя расчетная ширина различается).

Любые идеи, как я могу изменить размер окна NSAlert?


person Lupurus    schedule 11.02.2013    source источник
comment
Соглашения о пользовательском интерфейсе в Mac OS X заключаются в том, чтобы сделать диалоговые окна предупреждений выше для длинных сообщений, а не шире. Эта функция должна быть автоматической в ​​NSAlert; вам не придется ничего настраивать самостоятельно.   -  person    schedule 12.02.2013
comment
Что делать, если ваша строка действительно длинная? (В таком случае у вас будет оповещение, которое растянется по экрану?) Что, если ваша строка удлинится из-за того, что вы перевели, скажем, английский язык на романский, что сделает ее на 30% длиннее? (Снова та же проблема.) Ваш вопрос интригует, но обертка разработана в NSAlert, потому что, ну, она не знает, что должна отображать.   -  person Extra Savoir-Faire    schedule 12.02.2013
comment
Это нормально, и я это понимаю, но я просто показываю некоторые имена файлов (включая пути).   -  person Lupurus    schedule 12.02.2013
comment
PS: я бы также вставил условие if, чтобы проверить, шире ли окно, чем экран. Приведенный выше код не является полным. Я просто хотел протестировать...   -  person Lupurus    schedule 12.02.2013
comment
Отображение путей — это действительно хороший способ сделать оповещение неудобно широким и/или высоким; кроме того, пути просто уродливы, независимо от того, как вы их формируете. Вы вообще не должны отображать какой-либо путь к пользователю. Лучшим способом было бы использовать NSPathControl, который вы можете поместить в NSView, который вы затем будете использовать в качестве вспомогательного представления предупреждения.   -  person Peter Hosey    schedule 12.02.2013


Ответы (1)


NSAlert можно расширить, добавив дополнительное представление достаточной ширины:

NSAlert *alert = [[[NSAlert alloc] init] autorelease];
alert.accessoryView = [[[NSView alloc] initWithFrame:NSMakeRect(0, 0, 500, 0)] autorelease];
person D.McG.    schedule 22.10.2014
comment
ты гений! почему это еще не принятый ответ? - person Radu Simionescu; 18.12.2015
comment
этот ответ должен быть принят, в этом нет ничего плохого. - person Anoop Vaidya; 30.01.2018