gpt4 book ai didi

objective-c - NSMenuDelegate 未为另一个 NSMenuDelegate 创建的 NSMenuItem 中的子菜单调用

转载 作者:行者123 更新时间:2023-12-03 16:22:08 25 4
gpt4 key购买 nike

我有一个 NSStatusItem 和一个带有委托(delegate)的 NSMenu。该委托(delegate)根据几个因素动态更新菜单。因此,根据文档,为了快速更新菜单,我使用以下方法:

- (BOOL)menu:(NSMenu *)menu updateItem:(NSMenuItem *)item atIndex:(NSInteger)index shouldCancel:(BOOL)shouldCancel;

在该方法的适当时间,我调用以下内容:

NSMenu *submenu = [[NSMenu alloc] init];
SomeSubmenuDelegate *submenuDelegate = [[SomeSubmenuDelegate alloc] init];
submenu.delegate = submenuDelegate;
item.submenu = submenu;

状态菜单显示正确,并且相应的菜单项具有子菜单的显示三角形;但是,当突出显示适当的项目时,子菜单不会出现,即使在 SomeSubmenuDelegate 中存在以下方法,根据我的经验,该方法应该显示三个空白菜单项:

- (NSInteger)numberOfItemsInMenu:(NSMenu *)menu
{
return 3;
}

日志记录也没有执行任何操作,甚至在 menuWillOpen 中也不执行,因此看起来这些方法从未被调用,这让我相信在某个地方未设置委托(delegate),或者在运行时以某种方式复制了菜单,并且在此过程中未设置委托(delegate)。 .

目前的解决方法是在顶级 NSMenuDelegate(对于 NSStatusItem 的菜单)中创建整个子菜单,而不是分配委托(delegate)。这里有一些缺点

1)我将我的操作保留在 NSMenuDelegate 中,如果父菜单和子菜单有单独的文件,那就太好了。

2)虽然不一定重要,但这意味着我在每个需要子菜单 NSMenuItem 之前为其分配内存。

看起来最理想的是,我应该能够在这里使用委托(delegate),就像使用任何其他 NSMenu 一样。

非常感谢任何想法/建议。我的第一个问题在这里!

编辑:这是因为 ARC 吗?我可能错误地假设按照惯例 ARC 将保留委托(delegate)对象,从垃圾收集的角度思考,但也许它正在被释放,因为委托(delegate)是弱引用,而 ARC 不会做出这样的假设。我只能在Apple文档中找到对垃圾收集的引用,其中确实说垃圾收集将保持强引用......但显然,ARC不是垃圾收集,我找不到任何相关信息。这意味着我需要将委托(delegate)保留在父委托(delegate)中,这对于如此动态的东西来说似乎很难看。有没有办法在 ARC 下保留委托(delegate),然后在适当的时间释放它,而无需在父委托(delegate)(或与此相关的其他任何地方)中引用?

最佳答案

就我而言,我将菜单实例的声明从方法移至成员变量。

来自

-(void)awakeFromNIb{
..
[self setMenu:[[MyMenu alloc] init]];

 @implementation MyView{
MyMenu *myMenu;
}
-(void)awakeFromNib{
...
myMenu = [[MyMenu alloc]init];

[self setMenu:[myMenu createMenuStructure]];

方法:'createMenuStructure'在本地创建了我的菜单。 “MyMenu”实现了 NSMenuDelegate。

这将 myMenu 变量作为强引用。处理程序现在可以完美运行。

关于objective-c - NSMenuDelegate 未为另一个 NSMenuDelegate 创建的 NSMenuItem 中的子菜单调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18680322/

25 4 0