【问题标题】:Updating A Dynamically Created NSMenu with NSMenuItems使用 NSMenuItems 更新动态创建的 NSMenu
【发布时间】:2011-09-16 04:58:45
【问题描述】:

我有一个 NSMenu,我想保留 3 个静态 NSMenuItem,然后是动态生成的一堆,每次用户单击菜单图标时都应该删除并重新加载。

我正在尝试创建一个弹出的进程列表,但每次打开弹出窗口时,NSMenuItems 都不会清除。他们只是以某种时髦的方式添加。记录 for 循环表明循环没有完成。任何想法为什么?

-(void)menuNeedsUpdate:(NSMenu *)menu{

    //Keep Top 3 Menu Items
    if(dropDown.numberOfItems > 3){
        NSLog(@"-----------Removing Items");
        NSLog(@"%d",itemCount);
        for(int i = 2; i <= dropDown.numberOfItems; i++){
            NSLog(@"%d",i);
            [dropDown removeItemAtIndex:i];

        }
    }

    NSArray *appArray = [[NSWorkspace sharedWorkspace] runningApplications];


    for (NSRunningApplication *r in appArray){
        //NSLog(r.localizedName);
        //NSLog(@"------------");
        NSMenuItem *i = [[NSMenuItem alloc] initWithTitle:r.localizedName 
                                               action:@selector(fooClicked:) keyEquivalent:@""];
        [i setTarget:self];
        [dropDown addItem:i];

        [i release];
    }


}

【问题讨论】:

    标签: objective-c macos osx-lion nsmenuitem nsmenu


    【解决方案1】:

    您的问题在于删除代码。考虑一下:

    for(int i = 3; i <= dropDown.numberOfItems; i++){
        NSLog(@"%d",i);
        [dropDown removeItemAtIndex:i];
    }
    

    最后应该是i--。另外 - 如果数组有 3 个项目,最后一个项目的索引是 2,因此循环的声明应该如下:

    for(int i = 2; i >= 0; i--){
        NSLog(@"%d",i);
        [dropDown removeItemAtIndex:i];
    }
    

    根据评论更新

    从菜单中删除项目应该向后或向前执行,但在第二个项目之后立即删除相同的项目索引(即始终删除第三个项目):

    for(int i = 2; i <= dropDown.numberOfItems; i++){
        NSLog(@"%d",i);
        [dropDown removeItemAtIndex:2];
    }
    

    for(int i = dropDown.numberOfItems; i >= 2; i--){
        NSLog(@"%d",i);
        [dropDown removeItemAtIndex:i];
    }
    

    这是必需的,因为每次删除 ith 项目时,项目数组都会缩短,有时您会碰到超出数组边界的对象。考虑这种情况:

    1. 创建包含 3 个项目的数组
    2. 从 0 迭代到 2 删除 ith 项
      1. i = 0, check (i
      2. i = 1, check (i

    这将解释“时髦的方式”。

    【讨论】:

    • 对不起,但我想我需要重新表述我的问题,它确实从 2 开始,但这是我想要保留的两个菜单项。这是我想摆脱之后的一切。
    • 我已经尝试了两个版本,不幸的是第一个版本卡在我的原始代码所做的地方(循环没有完成并将更多进程附加到列表中),第二个版本没有删除任何 NSMenuItems根本没有,只是将进程列表附加到末尾。难道 menuNeedsUpdate 是删除菜单项的错误位置吗?
    • 没有。根据文档menuNeedsUpdate 是菜单项操作的确切位置。另外——我在第二个版本中发现了一个错误——应该是i&gt;=2,而不是i&lt;=2。我已经更新了我的答案。
    • 这似乎做到了!感谢您解释它并忍受我的问题。我还是个新手。 :) 虽然我现在有一个例外要处理,但我应该抓住它吗?我对objective-C还是有点粗糙,这是一个“数组越界”类型的情况吗?读它似乎是,但倒数我不应该越界对吗? Invalid parameter not satisfying: (index &gt;= 0) &amp;&amp; (index &lt; [_itemArray count])
    • 我认为您应该发布第二个问题并更新代码,因为这正在成为讨论。
    猜你喜欢
    • 2011-10-06
    • 1970-01-01
    • 2011-11-02
    • 2012-11-07
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多