ошибка меню какао [__NSCFNumber length]: нераспознанный селектор отправлен на экземпляр - PullRequest
2 голосов
/ 24 февраля 2012

Я хочу добавить некоторые элементы массива в настольное приложение menubar Какао

Вот мой код с ошибкой

NSMenu *menu =[[NSMenu alloc]initWithTitle:@"menu"];
NSMenuItem *itemTest = [[NSMenuItem alloc] initWithTitle:@"Test" action:@selector(menuActionTest:) keyEquivalent:@"t"];    
NSMenuItem *itemQuit = [[NSMenuItem alloc] initWithTitle:@"Quit App" action:@selector(menuActionQuit:) keyEquivalent:@"q"];



// add to menu
[menu addItem:itemTest];
[menu addItem:[NSMenuItem separatorItem]];


// handle the array, and here is the problem
NSArray* someList = [self getArray];
if ([someList count]>0) {
    for(NSString *title in someList) {
        NSLog(@"begin of add %@",title);
        // here is the problem code
        [menu addItem: [[NSMenuItem alloc] initWithTitle:title action:@selector(menuActionHelloWorld:) keyEquivalent:@""]];
        NSLog(@"end of add %@",title);
    }
    [someList release];
    [menu addItem:[NSMenuItem separatorItem]];
}

// add other to menu
[menu addItem:itemQuit];


//Define status bar-------------
NSStatusBar *bar = [NSStatusBar systemStatusBar];
NSStatusItem *statusItem = [[bar statusItemWithLength:NSVariableStatusItemLength]retain];

NSImage *menuImage = [NSImage imageNamed:@"status_off.png"];
[menuImage setTemplate:YES];
[statusItem setImage:menuImage];

[statusItem setHighlightMode:YES];
[statusItem setMenu:menu];

//Release----------------------
[itemTest release];
[itemQuit release];
[menu release];

, когда я использую

[menu addItem: [[NSMenuItem alloc] initWithTitle:title action:@selector(menuActionHelloWorld:) keyEquivalent:@""]];

приложение может хорошо работать, но когда я нажимаю значок состояния в строке меню, я получаю сообщение об ошибке

2012-02-24 16:20:38.393 MyApp[1546:503] -[__NSCFNumber length]: unrecognized selector sent to instance 0x202ecc3
2012-02-24 16:20:38.394 MyApp[1546:503] -[__NSCFNumber length]: unrecognized selector sent to instance 0x202ecc3
2012-02-24 16:20:38.398 MyApp[1546:503] (
0   CoreFoundation                      0x00007fff85ebbfc6 __exceptionPreprocess + 198
1   libobjc.A.dylib                     0x00007fff86c1cd5e objc_exception_throw + 43
2   CoreFoundation                      0x00007fff85f482ae -[NSObject doesNotRecognizeSelector:] + 190
3   CoreFoundation                      0x00007fff85ea8e73 ___forwarding___ + 371
4   CoreFoundation                      0x00007fff85ea8c88 _CF_forwarding_prep_0 + 232
5   CoreFoundation                      0x00007fff85e1f616 CFStringGetLength + 118
6   HIToolbox                           0x00007fff8cb95d07 _Z12CheckForDashP8MenuDatathPKhPK10__CFString + 100
7   HIToolbox                           0x00007fff8cb95c84 _Z26CleanupAfter1ItemInsertionP8MenuDatatPKhPK10__CFStringj + 41
8   HIToolbox                           0x00007fff8cb95823 _Z31_InsertMenuItemTextWithCFStringP8MenuDataPK10__CFStringtjj + 204
9   AppKit                              0x00007fff84ff8cfd -[NSCarbonMenuImpl _carbonMenuInsertItem:atCarbonIndex:] + 499
10  AppKit                              0x00007fff8513c1a2 -[NSCarbonMenuImpl _privatePopulateCarbonMenu] + 298
11  AppKit                              0x00007fff851c17a5 -[NSCarbonMenuImpl _populatePrivatelyIfNecessary] + 70
12  AppKit                              0x00007fff851c174b -[NSCarbonMenuImpl _checkoutMenuRefWithToken:creating:populating:] + 298
13  AppKit                              0x00007fff852edd46 -[NSCarbonMenuImpl _maximumSizeForScreen:] + 64
14  AppKit                              0x00007fff8545f72b -[NSMenu size] + 35
15  AppKit                              0x00007fff855517df +[NSStatusBarButtonCell popupStatusBarMenu:inRect:ofView:withEvent:] + 422
16  AppKit                              0x00007fff85551b85 -[NSStatusBarButtonCell trackMouse:inRect:ofView:untilMouseUp:] + 147
17  AppKit                              0x00007fff850d2bde -[NSControl mouseDown:] + 786
18  AppKit                              0x00007fff8509d6e0 -[NSWindow sendEvent:] + 6306
19  AppKit                              0x00007fff85552598 -[NSStatusBarWindow sendEvent:] + 66
20  AppKit                              0x00007fff8503616d -[NSApplication sendEvent:] + 5593
21  AppKit                              0x00007fff84fcc1f2 -[NSApplication run] + 555
22  AppKit                              0x00007fff8524ab88 NSApplicationMain + 867
23  RandomApp                           0x00000001067390e2 main + 34
24  RandomApp                           0x00000001067390b4 start + 52

Я новичок в Какао, я пытаюсь решить эту проблему самостоятельно.

Я нахожу

[__NSCFNumber length]

, поэтому я думаю, что проблема возникает из этой строки

 NSStatusItem *statusItem = [[bar statusItemWithLength:NSVariableStatusItemLength]retain];

Эта строка скопирована из примера Apple :) Она делает длину элемента статуса динамической, настраиваясь наширина его содержимого. Ссылка на класс NSStatusBar

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

Чтобы доказать это,Я пишу свой код как

[menu addItem: [[NSMenuItem alloc] initWithTitle:@"HelloWorld" action:@selector(menuActionHelloWorld:) keyEquivalent:@""]];    

, он хорошо работает.

Но мне действительно нужно получить заголовок динамически.

Итак, как я могу исправить свой код?

Спасибо!

изменить 1:

спасибо

Я добавляю

NSString *newTitle = [NSString stringWithFormat:@"%d",title];

в мой код,это работает.

Так что я думаю, что проблема становится моим методом getArray

Вот некоторые коды в моем методе getArray

NSMutableArray *List = [[NSMutableArray alloc] init];

for ( some conditions) {

// get something from a JSON result
NSString *title = [object valueForKeyPath:@"id"];

[List addObject:title];

}

return List;

На мой взгляд, списокмассив множества элементов NSString, но я думаю, что я не прав.что я должен сделать, чтобы улучшить мой код?Намного лучше?

1 Ответ

0 голосов
/ 24 февраля 2012

Звучит так, будто вы случайно передали NSNumber в качестве названия.(Я предполагаю это, потому что код работает нормально при добавлении HelloWorlds, а length является широко используемым методом для NSString.)

Мне нужно увидеть вашу реализацию getArray, чтобы знатьименно то, что пошло не так, но держу пари, что зная, что вы случайно попали туда NSNumber, вам будет достаточно решить эту проблему.(Кстати, какао-стильно называть ваши аксессуары просто array, а не getArray.)

...