NSFormatter usado com um NSPopupButton
-
19-09-2019 - |
Pergunta
Eu tenho um NSPopupButton cujos valores de conteúdo são obrigados a um NSArray de NSNumbers. O NSPopupButton exibe corretamente a matriz de números nele do menu pop-up. No entanto, quando eu alterar o valor selecionado, recebo uma mensagem:
HIToolbox: ignoring exception 'Unacceptable type of value for attribute: property = "tempo"; desired type = NSNumber; given type = NSCFString; value = 106.' that raised inside Carbon event dispatch
Obviamente, isto ocorre porque o objecto para o qual o valor seleccionado é ligado a uma espera NSNumber, e o NSPopupButton é dando-lhe um NSString. Olhando através de outros lugares, eu acho que o que eu preciso é um NSNumberFormatter.
No entanto, eu tentei usar um NSNumberFormatter, tanto através da Interface Builder, e programaticamente, mas o resultado não muda. Para referência, este é o código que eu tenho usado ao tentar definir o formatador do NSPopupButton programaticamente:
tempoFormatter = [[NSNumberFormatter alloc] init];
[tempoFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[tempoFormatter setFormat:@"### bpm"];
[[tempoButton cell] setFormatter:tempoFormatter];
(tempoButton é um IBOutlet ligado ao NSPopupButton)
Eu estou querendo saber se estiver usando um NSNumberFormatter é mesmo o que eu preciso? Se assim for, o que estou fazendo de errado? Eu li através da formatação de dados Guia de Programação; parece muito simples e direta, mas eu sinto que eu estou faltando alguma coisa.
Agradecemos antecipadamente.
Solução
Depende de qual a ligação que você está usando para obter o valor selecionado de NSPopupButton.
Se você está ligação ao "valor selecionado", você vai ter um NSString.
Se você está ligação ao "objeto selecionado", você vai ter o objeto representado pela seleção, que no seu caso seria uma NSNumber.
Caso contrário, você gostaria de acrescentar um NSValueTransformer à sua ligação para transformar o valor selecionado para o objeto que você está esperando.