2013-05-02 1 views
0

Попытка отчаянно найти, почему это происходит, когда я выбираю ячейку в своем табличном представлении, а затем прокручиваю таблицу вверх и вниз, когда ячейка подсвечивается, что приложение выходит из строя. Это дает мне ошибку -[__NSArrayM objectAtIndex:]: index 6 beyond bounds [0 .. 2], если я приведу в качестве примера «Искусство и музеи» или «Кофе и пекарни». Обе категории содержат 3 значения, поэтому имеет смысл получить [0 .. 2], но я не понимаю, почему это происходит. В общей сложности 6 из 10 ячеек (по 1 для каждой категории) создаются, когда приложение загружается, как я вижу на консоли. Компилятор подчеркивает это строки при возникновении ошибки: cell.textLabel.text = [arrayNo objectAtIndex:indexPath.row]; код ниже ...Ошибка «Beyond bounds» при работе с NSMutableArray

@interface PreViewController() 

{ 
    NSMutableArray *arrayNo; 
} 

@end 

@implementation PreViewController 

-(void)viewDidAppear:(BOOL)animated 
{ 

NSString *arts = @"Arts and Museums"; 
NSString *coffee = @"Coffee and Bakeries"; 
NSString *tours = @"Tours and Festivals"; 
NSString *hotels = @"Hotels and Inns"; 
NSString *leisure = @"Leisure and Recreation"; 
NSString *music = @"Live Music"; 
NSString *bars = @"Night Clubs and Bars"; 
NSString *food = @"Restaurants"; 
NSString *shopping = @"Shopping"; 
NSString *transportation = @"Transportation"; 

[arrayNo addObject:arts]; 
[arrayNo addObject:coffee]; 
[arrayNo addObject:tours]; 
[arrayNo addObject:hotels]; 
[arrayNo addObject:leisure]; 
[arrayNo addObject:music]; 
[arrayNo addObject:bars]; 
[arrayNo addObject:food]; 
[arrayNo addObject:shopping]; 
[arrayNo addObject:transportation]; 


    [[self myTableView] reloadData]; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    arrayNo = [[NSMutableArray alloc] init]; 
    [[self myTableView] setDelegate:self]; 
    [[self myTableView] setDataSource:self]; 
} 

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [arrayNo count]; 
} 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (!cell) 
    { 
     NSLog(@"CREATING NEW CELL"); 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
     cell.textLabel.textColor = [UIColor whiteColor]; 
     cell.textLabel.textAlignment = NSTextAlignmentCenter; 
     cell.textLabel.textColor = [UIColor colorWithRed:(100/255.0) green:(130/255.0) blue:(255/255.0) alpha:1.0]; 
    } 

    cell.textLabel.text = [arrayNo objectAtIndex:indexPath.row]; 

    return cell; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 

if (cell) 
{ 
    UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(reLoad)]; 
    tapped.numberOfTapsRequired = 1; 
    [cell addGestureRecognizer:tapped]; 
} 

if ([cell.textLabel.text isEqualToString: @"Arts and Museums"]) 
{   
    NSString *galleries = @"Art Galleries"; 
    NSString *dramatic = @"Dramatic Arts"; 
    NSString *museums = @"Museums"; 

    [arrayNo removeAllObjects]; 

    [arrayNo addObject:galleries]; 
    [arrayNo addObject:dramatic]; 
    [arrayNo addObject:museums]; 
} 

if ([cell.textLabel.text isEqualToString: @"Coffee and Bakeries"]) 
{ 
    NSString *bakeries = @"Bakeries"; 
    NSString *cafes = @"Cafés"; 
    NSString *shops = @"Coffee Shops"; 

    [arrayNo removeAllObjects]; 

    [arrayNo addObject:bakeries]; 
    [arrayNo addObject:cafes]; 
    [arrayNo addObject:shops]; 
} 
if ([cell.textLabel.text isEqualToString: @"Tours and Festivals"]) 
{ 
    NSString *festivals = @"Food and Drink Festivals"; 

    [arrayNo removeAllObjects]; 

    [arrayNo addObject:festivals];   
} 
if ([cell.textLabel.text isEqualToString: @"Hotels and Inns"]) 
{ 
    NSString *breakfasts = @"Bed and Breakfasts"; 
    NSString *hotels = @"Hotels"; 
    NSString *inns = @"Inns"; 
    NSString *motels = @"Motels"; 

    [arrayNo removeAllObjects]; 

    [arrayNo addObject:breakfasts]; 
    [arrayNo addObject:hotels]; 
    [arrayNo addObject:inns]; 
    [arrayNo addObject:motels]; 
} 
if ([cell.textLabel.text isEqualToString: @"Leisure and Recreation"]) 
{ 
    NSString *arcades = @"Arcades"; 
    NSString *beaches = @"Beaches"; 
    NSString *bowling = @"Bowling"; 
    NSString *breweries = @"Breweries"; 
    NSString *campgrounds = @"Campgrounds"; 
    NSString *cinemas = @"Cinemas"; 
    NSString *climbing = @"Climbing"; 
    NSString *parks = @"Parks"; 
    NSString *ski = @"Ski Resorts"; 
    NSString *spa = @"Spa Resorts"; 
    NSString *water = @"Water Rentals"; 

    [arrayNo removeAllObjects]; 

    [arrayNo addObject:arcades]; 
    [arrayNo addObject:beaches]; 
    [arrayNo addObject:bowling]; 
    [arrayNo addObject:breweries]; 
    [arrayNo addObject:campgrounds]; 
    [arrayNo addObject:cinemas]; 
    [arrayNo addObject:climbing]; 
    [arrayNo addObject:parks]; 
    [arrayNo addObject:ski]; 
    [arrayNo addObject:spa]; 
    [arrayNo addObject:water]; 
} 
if ([cell.textLabel.text isEqualToString: @"Live Music"]) 
{ 
    NSString *bars = @"Bars"; 
    NSString *clubs = @"Clubs"; 
    NSString *restaurants = @"Restaurants"; 
    NSString *theaters = @"Theaters"; 

    [arrayNo removeAllObjects]; 

    [arrayNo addObject:bars]; 
    [arrayNo addObject:clubs]; 
    [arrayNo addObject:restaurants]; 
    [arrayNo addObject:theaters]; 
} 
if ([cell.textLabel.text isEqualToString: @"Night Clubs and Bars"]) 
{ 
    NSString *bars = @"Bars"; 
    NSString *lounges = @"Lounges"; 
    NSString *clubs = @"Night Clubs"; 

    [arrayNo removeAllObjects]; 

    [arrayNo addObject:bars]; 
    [arrayNo addObject:lounges]; 
    [arrayNo addObject:clubs]; 
} 
if ([cell.textLabel.text isEqualToString: @"Restaurants"]) 
{ 
    NSString *asian = @"Asian"; 
    NSString *fast = @"Fast Food"; 
    NSString *french = @"French"; 
    NSString *german = @"German"; 
    NSString *grill = @"Grill and Variety"; 
    NSString *indian = @"Indian"; 
    NSString *italian = @"Italian"; 
    NSString *mexican = @"Mexican"; 
    NSString *eastern = @"Middle Eastern"; 
    NSString *seafood = @"Seafood"; 

    [arrayNo removeAllObjects]; 

    [arrayNo addObject:asian]; 
    [arrayNo addObject:fast]; 
    [arrayNo addObject:french]; 
    [arrayNo addObject:german]; 
    [arrayNo addObject:grill]; 
    [arrayNo addObject:indian]; 
    [arrayNo addObject:italian]; 
    [arrayNo addObject:mexican]; 
    [arrayNo addObject:eastern]; 
    [arrayNo addObject:seafood]; 
} 
if ([cell.textLabel.text isEqualToString: @"Shopping"]) 
{ 
    NSString *art = @"Art Supplies"; 
    NSString *books = @"Books"; 
    NSString *candy = @"Candy"; 
    NSString *cooking = @"Cooking"; 
    NSString *electronics = @"Electronics"; 
    NSString *apparel = @"Apparel"; 
    NSString *florists = @"Florists"; 
    NSString *grocery = @"Grocery"; 
    NSString *health = @"Health"; 
    NSString *home = @"Home"; 
    NSString *jewlery = @"Jewelry"; 
    NSString *music = @"Music"; 
    NSString *outdoor = @"Outdoor Gear"; 
    NSString *photography = @"Photography"; 
    NSString *souvenirs = @"Souvenirs"; 
    NSString *sports = @"Sports"; 

    [arrayNo removeAllObjects]; 

    [arrayNo addObject:apparel]; 
    [arrayNo addObject:art]; 
    [arrayNo addObject:books]; 
    [arrayNo addObject:candy]; 
    [arrayNo addObject:cooking]; 
    [arrayNo addObject:electronics]; 
    [arrayNo addObject:florists]; 
    [arrayNo addObject:grocery]; 
    [arrayNo addObject:health]; 
    [arrayNo addObject:home]; 
    [arrayNo addObject:jewlery]; 
    [arrayNo addObject:music]; 
    [arrayNo addObject:outdoor]; 
    [arrayNo addObject:photography]; 
    [arrayNo addObject:souvenirs]; 
    [arrayNo addObject:sports]; 
} 
if ([cell.textLabel.text isEqualToString: @"Transportation"]) 
{ 
    NSString *airports = @"Airports"; 
    NSString *bicycle = @"Bicycle Rentals"; 
    NSString *bus = @"Bus Lines"; 
    NSString *ferries = @"Ferries"; 
    NSString *taxis = @"Taxis"; 
    NSString *trains = @"Trains"; 
    NSString *rentals = @"Vehicle Rentals"; 

    [arrayNo removeAllObjects]; 

    [arrayNo addObject:airports]; 
    [arrayNo addObject:bicycle]; 
    [arrayNo addObject:bus]; 
    [arrayNo addObject:ferries]; 
    [arrayNo addObject:taxis]; 
    [arrayNo addObject:trains]; 
    [arrayNo addObject:rentals]; 
} 

}

- (void) reLoad 
{ 
    [self.myTableView reloadData]; 
} 

ответ

0

Если бы я был догадаться .. Я бы сказал, чтобы избавиться от GestureRecognizer, и просто выполните reloadData после того, как вы изменили содержимое массива, в качестве последнего оператора метода didSelectRowAtIndexPath. Вероятно, проблема возникает из-за того, что reloadData никогда не вызывается вовремя, таблица считает, что она по-прежнему содержит 10 строк, поскольку никакой новый вызов не был сделан для numberOfRowsInSection.

GestureRecognizers должны быть выделены & добавлен перед тем, как будет сделан жест, и вам не нужен один с ячейками таблицы, так как вы сделалиSelectRowAtIndexPath.

+0

Спасибо! Я проверю это. Моя единственная мысль заключается в том, что я, по крайней мере, хотел бы использовать GestureRecognizer для навигации назад (doubletap), но, возможно, я изучу альтернативу. – Greg

 Смежные вопросы

  • Нет связанных вопросов^_^