Сбой приложения pickerview из-за NSRangeException NSCFArray objectAtIndex: index (5) ... за пределами (5) - PullRequest
1 голос
/ 01 февраля 2010

Вновь приступая к разработке iphone, я собираю кучу приложений типа UIPicker, последнее из которых - игра типа игровых автоматов, очень простая.Во всяком случае, я не совсем понимаю, почему эта ошибка появляется.Насколько я понимаю, представление выбора запрашивает у своего делегата объект в массиве, который находится за пределами диапазона, доступного этому массиву.

При этом я понятия не имею, почему он это делает или как это исправить,любая помощь будет оценена, вот код из конкретного файла .m (полный проект здесь: http://files.me.com/knyck2/89q3w3):

 //
 //  CustomPickerViewController.m
 //  Pickers
 //
 //  Created by Nicholas Iannone on 1/29/10.
 //  Copyright 2010 Apple Inc. All rights reserved.
 //

 #import "CustomPickerViewController.h"


 @implementation CustomPickerViewController

 @synthesize column1, column2, column3, column4, column5, picker, winLabel;

 -(IBAction) spin : (id) sender {

NSLog(@"even got here");

BOOL win = NO;

int numInRow = 1;

int lastVal = -1;

for (int i = 0; 1 < 5; i++) {
    int newValue = random() % [self.column1 count];

    if (newValue == lastVal) {
        NSLog(@"even got here");

    numInRow++;
    }
    else 
        numInRow = 1;

        lastVal = newValue;
    [picker selectRow:newValue inComponent:i animated:YES];
    [picker reloadComponent:i];
    if (numInRow >= 3) 
        win = YES;

    NSLog(@"even got here");

}

if (win) 
    winLabel.text = @"winner!";

              else {
    winLabel.text = @"";
              NSLog(@"even got here");
              }

 }

 /*
  // The designated initializer.  Override if you create the controller programmatically                and want to perform customization that is not appropriate for viewDidLoad.
 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
    // Custom initialization
}
return self;
 }
 */


 // Implement viewDidLoad to do additional setup after loading the view, typically from      a nib.
 - (void)viewDidLoad {
UIImage *seven = [UIImage imageNamed:@"seven.png"];
UIImage *bar = [UIImage imageNamed:@"bar.png"];
UIImage *crown = [UIImage imageNamed:@"crown.png"];
UIImage *cherry = [UIImage imageNamed:@"cherry.png"];
UIImage *lemon = [UIImage imageNamed:@"lemon.png"];
UIImage *apple = [UIImage imageNamed:@"apple.png"];

    for (int i = 1; i <= 5 ;  i++) {
        UIImageView *sevenView = [[UIImageView alloc] initWithImage: seven];
        UIImageView *barView = [[UIImageView alloc] initWithImage: bar];
        UIImageView *crownView = [[UIImageView alloc] initWithImage: crown];
        UIImageView *cherryView = [[UIImageView alloc] initWithImage:      cherry];
        UIImageView *lemonView = [[UIImageView alloc] initWithImage: lemon];
        UIImageView *appleView = [[UIImageView alloc] initWithImage: apple];


        NSArray *imageViewArray = [[NSArray alloc] initWithObjects:      sevenView, barView, crownView, cherryView, lemonView, appleView, nil];
        NSString *fieldName =[[NSString alloc] initWithFormat:@"column%d",      i];
        [self setValue:imageViewArray forKey:fieldName];
        [fieldName release];
        [imageViewArray release];

        [sevenView release];
        [crownView release];
        [barView release];
        [cherryView release];
        [lemonView release];
        [appleView release];

    }

srandom(time(NULL));
[super viewDidLoad];
 }



 /*
 // Override to allow orientations other than the default portrait orientation.
 -(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
 }
 */

 - (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];

// Release any cached data, images, etc that aren't in use.
 }

 - (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
 }


 - (void)dealloc {
[picker release];
[winLabel release];
[column1 release];
[column2 release];
[column3 release];
[column4 release];
[column5 release];


[super dealloc];
 }


 #pragma mark -
 #pragma mark Picker Data Source Methods

 -(NSInteger) numberOfComponentsInPickerView: (UIPickerView *)  pickerView {

return 5;
 }


 -(NSInteger) pickerView: (UIPickerView *) pickerView numberOfRowsInComponent:      (NSInteger) component {

return [self.column1 count];

 }

 #pragma mark Picker Delegate Methods

 -(UIView *) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent: (NSInteger) component reusingView : (UIView *)view {

NSString *arrayName = [[NSString alloc] initWithFormat:@"column%d", component + 1];
NSArray *array = [self valueForKey:arrayName];
NSLog(@"got here yo");
return [array objectAtIndex: row];
NSLog(@"holyshit");


 }

 @end

Ответы [ 2 ]

3 голосов
/ 01 февраля 2010

Причина, по которой он разрывается, заключается в этом цикле. Взгляните на условие цикла:

1 < 5. Да, 1 равно всегда меньше 5. Это означает, что у вас бесконечный цикл. Я уверен, что вы имели в виду i < 5.

for (int i = 0; 1 < 5; i++) {
    int newValue = random() % [self.column1 count];

    if (newValue == lastVal) {
        NSLog(@"even got here");

    numInRow++;
    }
    else 
        numInRow = 1;

        lastVal = newValue;
    [picker selectRow:newValue inComponent:i animated:YES];
    [picker reloadComponent:i];
    if (numInRow >= 3) 
        win = YES;

    NSLog(@"even got here");

}
2 голосов
/ 01 февраля 2010

Вы проверяете, если 1 < 5, что всегда верно. Вы хотите i < 5.

...