0

わかりましたので、動作しないように見えるアルゴリズムをここに書きました。基本的に、複数のページにわたってボタンのリストを描画します。iPhone 5 では 1 ページに 4 個、iPhone 4S 以前では 3 個のボタンが描画されるように調整されています。

しかし、何らかの理由で、「setFrame」メソッドで次のエラーが発生します。

例外がキャッチされていないため、アプリを終了しています:

'NSInvalidArgumentException', reason: '-[__NSCFArray length]: unrecognized selector sent to instance

奇妙なことは、アルゴリズムのどこにも、アプリの他のどこにもメソッドlength];が呼び出されないことです。

NSArraysまた、このメソッドをいつ使用するかはわかりません。また、メソッドがないことも知っていますlength

アルゴリズムは次のとおりです。

// creates the chapters
+(void)createChapterInScrollView:(UIScrollView *)scrollview withArray:(NSArray *)array withTarget:(id)target andMethod:(SEL)method
{
    // sets up some initial variable
    int x = 20;
    int y = 40;

    // fills an array with the y values
    int yValues;
    NSMutableArray *yContainer = [[NSMutableArray alloc] init];
    if (screenHeight == 568) {
        yValues = 4;
    } else {
        yValues = 3;
    }
    for (yValues = yValues; yValues > 0; yValues = yValues - 1) {
        [yContainer addObject:[NSString stringWithFormat:@"%i", y]];
        y = y + 70;
    }

    // creates the buttons using the number of pages
    int numOfpages = [self numOfPagesFromArray:array];
    int numofPagesLeft = [self numOfPagesFromArray:array];
    int numOfButtonsLeft = [array count];
    int currentButton = 0;

    if (numofPagesLeft == 0) {

    } else {
        for (numofPagesLeft = numofPagesLeft; numofPagesLeft >= 0; numofPagesLeft = numofPagesLeft - 1) {
            for (id object in yContainer) {
                if (numOfButtonsLeft > 0) {
                    UIButton *newButton = [UIButton buttonWithType:UIButtonTypeCustom];
                    [newButton setTitle:[array objectAtIndex:currentButton] forState:UIControlStateNormal];
                    [newButton setTitleColor:[UIColor lightGrayColor] forState:UIControlStateHighlighted];
                    [newButton setFrame:CGRectMake(x, [object floatValue], 280, 50)];
                    [newButton setTag:(currentButton+1)];
                    [newButton setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
                    [newButton.titleLabel setTextAlignment:NSTextAlignmentLeft];
                    [newButton addTarget:target action:method forControlEvents:UIControlEventTouchUpInside];
                    [scrollview addSubview:newButton];
                    numOfButtonsLeft = numOfButtonsLeft - 1;
                    currentButton ++;
                }
            }
            x = x + 320;
        }
    }

    // checks if any buttons were actually created
    if (numOfpages == 0) {
        // tells the user that no content has been downloaded
        UILabel *errorLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 0, 300, 216)];
        [errorLabel setBackgroundColor:[UIColor clearColor]];
        [errorLabel setTextColor:[UIColor whiteColor]];
        [errorLabel setNumberOfLines:10];
        [errorLabel setFont:[UIFont systemFontOfSize:17]];
        [errorLabel setTextAlignment:NSTextAlignmentCenter];
        [errorLabel setText:@"Oops!\n\nLooks like no readable content has been downloaded!\n\nThe content will be automatically downloaded right now!"];
        [scrollview addSubview:errorLabel];
    }
}

みんなありがとう!

4

1 に答える 1

0

Xcode で、ブレークポイント ナビゲーターに移動し、例外ブレークポイントを追加します。それを行う方法の簡単な説明は、このSOの回答にあります

これを取得すると、コードのどの行が例外を引き起こしているかを正確に確認できるはずです。

于 2013-08-17T23:04:51.537 に答える