2010-02-01 72 views
1

再次工作通过开始iPhone开发,我正在放在一起UIPicker类型的应用程序,最后一个是老虎机类型的游戏,超级简单。无论如何,我不是很明白为什么会出现这个错误。根据我的理解,选择器视图会要求其代表在数组中超过该数组可用范围的对象。pickerview应用程序崩溃,由于NSRangeException NSCFArray objectAtIndex:索引(5)...超出界限(5)

话虽这么说,我不知道它为什么这样做或如何解决它,任何帮助,将不胜感激,继承人从特定.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 

回答

3

它打破的原因是这个循环。看看你的for循环条件:

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"); 

} 
+0

呃,非常感谢,我不认为我会找到那个,哈哈。 – nickthedude 2010-02-01 20:18:31

+0

你知道为什么uipickerview不会为选定的行设置动画,即使动画参数设置为“YES”? – nickthedude 2010-02-01 21:25:23

2

您正在测试是否1 < 5,这总是如此。你想要i < 5

相关问题