0

保持したい 3 つの静的 NSMenuItems を持つ NSMenu があり、その後の束は動的に生成され、ユーザーがメニュー アイコンをクリックするたびに削除して再読み込みする必要があります。

ポップアウトするプロセスのリストを作成しようとしていますが、ポップアウトを開くたびに 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];
    }


}
4

1 に答える 1

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];
}

コメントに従って更新

メニューからのアイテムの削除は、逆方向または順方向に実行する必要がありますが、2番目のアイテムの直後に同じアイテムインデックスを削除します(つまり、常に3番目のアイテムを削除します)。

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];
}

これが必要なのは、アイテムを削除するたびiに、アイテムの配列が短くなり、配列の境界を超えているオブジェクトにヒットすることがあるためです。このシナリオを考えてみましょう。

  1. 3つのアイテムの配列を作成します
  2. 0から2まで繰り返して、ith項目 を削除します
    1. i = 0、チェック(i <3アイテム)最初のアイテムを削除します。アイテムの配列は2(0、1)に短縮されます。
    2. i = 1、チェック(i <2アイテム)で最初のアイテムを削除します。アイテムの配列は1(0)に短縮されますが、2番目のアイテムのみが削除されるため、前の反復から0番目のアイテム(元のアイテムから1番目のアイテム)が残ります。セットする)。

これは「ファンキーな方法」を説明するでしょう。

于 2011-09-16T06:18:05.917 に答える