NSMenuItem переключить стиль полужирного шрифта

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

@implementation NSMenuItem (Font)

-(void)setBoldStyle:(bool)bBold{
    NSString* title = [self title] ;

    NSFont *pFont = (bold)?[NSFont boldSystemFontOfSize:14]:[NSFont menuFontOfSize:12];

    NSDictionary* fontAttribute = [NSDictionary dictionaryWithObjectsAndKeys:
                                   pFont, NSFontAttributeName,
                                   nil] ;

    NSMutableAttributedString* newTitle = [[NSMutableAttributedString alloc] initWithString:title
                                                                                 attributes:fontAttribute] ;

    [self setAttributedTitle:newTitle] ;
    [newTitle release] ;

}

@end

С приведенным выше фрагментом кода я могу установить полужирный текст, когда выбран конкретный NSMenuItem, но если его нужно переключить (означает, что если элемент был жирным ранее, теперь он должен быть нормальным), то этого не происходит,

Вот как я это называю,

    // have we selected any menuitem yet
    if ( prevStatusIndex >0){
        // then deselect it
        pTempMenuItem = [pMenu itemAtIndex:prevStatusIndex];
        [pTempMenuItem setBoldStyle:NO];
    }

    prevStatusIndex = clientStatus+1;
    pTempMenuItem = [pMenu itemAtIndex:prevStatusIndex]; // 1 because a separator added
    [pTempMenuItem setBoldStyle:YES];

Любая идея, что происходит не так?


person Amitg2k12    schedule 05.04.2013    source источник
comment
Похоже, вы пытаетесь выбрать только один элемент из группы — выберите элемент, и предыдущий выбор должен быть отменен. На первый взгляд ваш setBoldStyle выглядит нормально, но второй блок кода не показывает достаточно. Логика выглядит примерно правильно - если был предыдущий выбор, отмените его выбор, затем выберите новый выбор. Вы уверены, что if оценивается как YES, когда был предыдущий выбор? ХТН   -  person CRD    schedule 05.04.2013
comment
@CRD: я проверил это :(, если я поставлю какой-нибудь журнал, он выглядит с использованием правильного указателя NSMenuItem   -  person Amitg2k12    schedule 06.04.2013
comment
Вы установили точку останова на setBoldStyle? Отметьте жирным шрифтом (я предполагаю, что bBold является опечаткой выше - если это не так, и у вас также есть экземпляр var жирный...), выполните шаг, выбран ли правильный шрифт? И т.п.   -  person CRD    schedule 07.04.2013
comment
я сделал это первым, прежде чем опубликовать его в SO :(   -  person Amitg2k12    schedule 08.04.2013


Ответы (2)


Вам нужно использовать подобное:

if ([pTempMenuItem boldStyle]) {
    NSLog(@"currently bold. change it");
    [pTempMenuItem setBoldStyle:NO]);
}
else{
    [pTempMenuItem setBoldStyle:YES]);
    NSLog(@"currenlty normal. change it");
}
person Anoop Vaidya    schedule 05.04.2013

Мы можем только догадываться, так как в вашем вопросе отсутствует много информации - где prevStatusIndex, pMenuItem, pMenu и clientStatus объявлены и заданы значения? Каков допустимый диапазон clientStatus? И т.п.

В комментариях вы сказали, что использовали отладчик и точки останова, но не указали, какие значения вы видели.

Вам действительно нужно предоставить более подробную информацию, чтобы народ мог вам помочь.

При условии, что выбранный индекс никогда не равен 0 (т. е. prevStatusIndex не равен 0 или clientStatus не равен -1) и pMenu указывает на правильное меню, тогда ваш код работает. Если выбранный индекс может быть равен нулю, вам нужно изменить тест для удаления жирного шрифта на prevStatusIndex >= 0, иначе первая запись в меню может быть выделена жирным шрифтом, но не жирным шрифтом.

ХТН.

person CRD    schedule 08.04.2013