gpt4 book ai didi

macos - NSMenu 突出显示特定的 NSMenuItem

转载 作者:行者123 更新时间:2023-12-03 16:15:02 46 4
gpt4 key购买 nike

如何突出显示特定的NSMenuItemNSMenu 上只有 highlightedItem 方法,但没有 setHighlightedItem

最佳答案

更新

通过浏览 OS X Runtime headers我在 NSMenu 上找到了另一种方法,它不需要获取 Carbon 菜单实现。该方法称为 highlightItem: 并按预期工作。

所以本质上,NSMenu 类别可以简化为以下内容:

@interface NSMenu (HighlightItemUsingPrivateAPIs)

- (void)_highlightItem:(NSMenuItem*)menuItem;

@end

@implementation NSMenu (HighlightItemUsingPrivateAPIs)

- (void)_highlightItem:(NSMenuItem*)menuItem
{
const SEL selHighlightItem = @selector(highlightItem:);

if ([self respondsToSelector:selHighlightItem]) {
[self performSelector:selHighlightItem withObject:menuItem];
}
}

@end

原始答案

虽然似乎没有官方方法可以做到这一点,但可以使用私有(private)(!)API。

这是我为 NSMenu 编写的一个类别,它允许您突出显示特定索引处的项目:

@interface NSMenu (HighlightItemUsingPrivateAPIs)

- (void)_highlightItemAtIndex:(NSInteger)index;

@end

@implementation NSMenu (HighlightItemUsingPrivateAPIs)

- (void)_highlightItemAtIndex:(NSInteger)index
{
const SEL selMenuImpl = @selector(_menuImpl);

if ([self respondsToSelector:selMenuImpl]) {
id menuImpl = [self performSelector:selMenuImpl];

const SEL selHighlightItemAtIndex = @selector(highlightItemAtIndex:);

if (menuImpl &&
[menuImpl respondsToSelector:selHighlightItemAtIndex]) {
NSMethodSignature* signature = [[menuImpl class] instanceMethodSignatureForSelector:selHighlightItemAtIndex];

NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setTarget:menuImpl];
[invocation setSelector:selHighlightItemAtIndex];
[invocation setArgument:&index atIndex:2];
[invocation invoke];
}
}
}

@end

首先,它获取 NSMenu 的 Carbon 菜单实现 (NSCarbonMenuImpl),然后使用指定索引继续调用 highlightItemAtIndex: 。该类别的编写方式是这样的:如果 Apple 决定更改此处使用的私有(private) API,该类别会正常失败。

关于macos - NSMenu 突出显示特定的 NSMenuItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31989979/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com