2014-09-02 3 views
0

У меня есть NSAlert с аксессуаром NSView, который содержит два элемента NSTextField. Я могу поместить курсор в NSTextField, но я не могу ввести их. Вместо этого он набирает последнюю строку, которую я вводил в Xcode. Я использую Xcode 6.NSAlert не работает с NSTextField

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 

    NSAlert *passRequest = [[NSAlert alloc] init]; 
    [passRequest setMessageText:@"Finder wants to restart. Type your  password to allow this."]; 
    [passRequest addButtonWithTitle:@"OK"]; 
    [passRequest addButtonWithTitle:@"Cancel"]; 
    [passRequest setAccessoryView:[InputView inputViewWithUsername:@"James Pickering"]]; 

    NSImage *lockImage = [[NSImage alloc] initWithContentsOfFile:@"LOCK_YOSEMITE.png"]; 
    [passRequest setIcon:lockImage]; 
    [passRequest runModal]; 
} 

Я сделал реализовать ключ LSUIElement, но даже до того, что он не работает должным образом. В противном случае, это прямо из коробки приложение для какао.

Вот мой код InputView:

#import "InputView.h" 

@interface InputView() 

@property (strong, nonatomic) NSString *username; 

@end 

@implementation InputView 

+ (InputView *)inputViewWithUsername:(NSString *)username { 
    InputView *view = [[self alloc] initWithFrame:NSRectFromCGRect(CGRectMake(0, 0, 321, 52))]; 
    [view setUsername:username]; 
    return view; 
} 

- (void)drawRect:(NSRect)dirtyRect { 
    [super drawRect:dirtyRect]; 

    NSTextField *usernameLabel = [[NSTextField alloc] initWithFrame:NSRectFromCGRect(CGRectMake(0, 32, 71, 17))]; 

    [usernameLabel setStringValue:@"Username:"]; 
    [[usernameLabel cell] setBordered:NO]; 
    [[usernameLabel cell] setBezeled:NO]; 

    [usernameLabel setEditable:NO]; 
    [usernameLabel setSelectable:NO]; 
    [usernameLabel setBackgroundColor:[NSColor clearColor]]; 
    [usernameLabel setFont:[NSFont systemFontOfSize:13]]; 
    [self addSubview:usernameLabel]; 

    NSTextField *passwordLabel = [[NSTextField alloc] initWithFrame:NSRectFromCGRect(CGRectMake(2, 2, 69, 17))]; 

    [passwordLabel setStringValue:@"Password:"]; 
    [[passwordLabel cell] setBordered:NO]; 
    [[passwordLabel cell] setBezeled:NO]; 

    [passwordLabel setEditable:NO]; 
    [passwordLabel setSelectable:NO]; 
    [passwordLabel setBackgroundColor:[NSColor clearColor]]; 
    [passwordLabel setFont:[NSFont systemFontOfSize:13]]; 
    [self addSubview:passwordLabel]; 

    NSTextField *usernameInput = [[NSTextField alloc] initWithFrame:NSRectFromCGRect(CGRectMake(77, 30, 206, 22))]; 

    [usernameInput setStringValue:self.username]; 
    [usernameInput setFont:[NSFont systemFontOfSize:13]]; 
    [self addSubview:usernameInput]; 

    NSTextField *passwordInput = [[NSTextField alloc] initWithFrame:NSRectFromCGRect(CGRectMake(77, 0, 206, 22))]; 

    [passwordInput setFont:[NSFont systemFontOfSize:13]]; 
    [self addSubview:passwordInput]; 
} 

@end 
+0

void displayFinderAlertWithMessage (NSString * msg)? Тебе лучше быть лучше. –

+0

@ElTomato, что вы имеете в виду? – jamespick

ответ

0

Я называю эту функцию в междунар основной.

Это ваша проблема. Для предупреждения требуется полное приложение, настроенное и выполняющее цикл событий. Для того, чтобы печатать, чтобы перейти к нему, это должно быть активное приложение.

Возможно, вам необходимо создать обычное приложение из шаблона Xcode. Начните с этого. Там все работает. Вы можете представить свое предупреждение в методе действий, который связан с элементом меню или кнопкой в ​​окне или что-то еще. (Вы также можете представить в методе делегата -applicationDidFinishLaunching:.)

После того, как вы получили эту работу, если есть какая-то причина, вам нужно, чтобы это работало в необычном контексте (например, инструмент командной строки), вы может работать над этим.


Вы изменяете зрения иерархии внутри вашего метода -drawRect:. Вы не должны этого делать.

Во-первых, -drawRect: можно назвать много раз в течение срока представления и вы будете добавлять подвиды каждый раз, когда он рисует. Все больше и больше подходов, снова и снова.

Во-вторых, даже если вы были осторожны, чтобы добавить их только в первый раз, -drawRect: предназначен для рисования, а не для изменения иерархии представлений. (Есть -viewWillDraw, если вам нужно внести такие изменения непосредственно перед рисованием, но я не думаю, что это подходит для этого случая.)

Вместо этого вы можете добавить subviews вместо переопределения -initWithFrame:.

Кстати, вы, вероятно, должны использовать NSMakeRect() вместо NSRectFromCGRect(CGRectMake(...)).

+0

Итак, я добавил код в делегат приложения, но у меня все еще такая же проблема. На этот раз я получаю вращающийся пляжный мяч, когда я что-то делаю с ним. – jamespick

+0

Это нормальное, полное приложение в комплекте? И он запускается обычным способом (из Xcode, Finder или Dock)? Обновите свой вопрос, чтобы показать новый код. Вы уверены, что Xcode не остановил процесс, потому что он попал в исключение, сигнал или точку останова? Вы можете использовать Activity Monitor, чтобы пробовать процесс, когда он застрял. Поместите этот отчет образца в свой вопрос. –

+0

Приложение продолжает работать. Я обновил свой вопрос. – jamespick

Смежные вопросы