Obj-C、 ‘NSRangeException’、理由: ‘ – [NSMutableArray objectAtIndex:]:境界2を超えるインデックス2 [0 .. 1]’

私は先日質問を投稿しましたが、十分なコードは含まれておらず、さらに問題があります。私は
[[UIApplication sharedApplication] windows]
を使用すべきかどうかはわかりませんが、前日の修正を提案して以来、配列には正しい量の値がありません。

誰かが私に間違っているところを教えてくれますか? [[UIApplication
sharedApplication] windows]
を使用するのが正しいかどうかを教えてください。

- (void) addDoneToKeyboard {

    doneButton.hidden =  NO;

    //Add a button to the top, above all windows
    NSArray *allWindows = [[UIApplication sharedApplication] windows];
    NSUInteger topWindowIndex = [allWindows count];// fix - 1;
    UIWindow *topWindow = [allWindows objectAtIndex:topWindowIndex]; //SIGABRT

[NSRangeException ‘、理由:’ [NSMutableArray
objectAtIndex:]:境界2を超えたインデックス2 ‘]

   //check if top window is of keypad or else
    NSString *topViewClassName = [NSString stringWithFormat:@"%@", 
             [topWindow class]];
    while (![topViewClassName isEqualToString:@"UITextEffectsWindow"] ) {
        --topWindowIndex;

        if(topWindowIndex < 1)//fix 0
            break;

        topWindow = [allWindows objectAtIndex:topWindowIndex];
        topViewClassName = [NSString stringWithFormat:@"%@", [topWindow class]];
    }

//

    if(topWindowIndex < 1) {//fix 0
        topWindowIndex = [allWindows count] - 1;
        topWindow = [allWindows objectAtIndex:topWindowIndex];
    }

    if (doneButton.superview)
        [doneButton removeFromSuperview];

    [topWindow addSubview:doneButton];

    if (!doneButtonShownRecently) {
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationBeginsFromCurrentState:YES];
        [UIView setAnimationDuration:SLIDE_IN_ANIMATION_DURATION];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
        doneButton.frame = CGRectMake(0, 480-53, 
                         doneButton.frame.size.width, 53);
        [UIView commitAnimations];
    } else {
        doneButton.frame = CGRectMake(0, 427, 
                         doneButton.frame.size.width, 53);
    }

    doneButtonShown = YES;
}
ベストアンサー

ここにあるこのコードも間違っています:

// check if top window is of keypad or else
NSString *topViewClassName = [NSString stringWithFormat:@"%@", 
         [topWindow class]];
while (![topViewClassName isEqualToString:@"UITextEffectsWindow"] ) {
    --topWindowIndex;

    if(topWindowIndex < 1)//fix 0
        break;

    topWindow = [allWindows objectAtIndex:topWindowIndex];
    topViewClassName = [NSString stringWithFormat:@"%@", [topWindow class]];
}

あなたが本当に欲しいのは次のとおりです:

// check if top window is of keypad or else
BOOL foundTextEffectsWindow = NO;
while (topWindowIndex >= 0) {
    topWindow = [allWindows objectAtIndex:topWindowIndex];
    if ([topWindow isKindOfClass:[UITextEffectsWindow class]]) {
      foundTextEffectsWindow = YES;
      break;
    }

    topWindowIndex--;
}
if (foundTextEffectsWindow) {
  //do stuff with the window
}

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です