2012-05-25 2 views
0

Я создаю приложение для отслеживания расходов.Ошибка получения заголовка для раздела

Мое требование - получить дату в заголовке раздела и расходы, добавленные в эту дату в таблицу View. Я попробовал следующий код, но не работал.

-(IBAction)bydate:(id)sender 
{ 
[self.byDateArray removeAllObjects]; 
[self.byDateCountArray removeAllObjects]; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; 
[dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
for(NSManagedObject *info in self.listOfExpenses){ 
    NSString *compareDates = [dateFormatter stringFromDate:[info valueForKey:@"date"]]; 
    BOOL isAvail = NO; 
    for (int i = 0; i<[self.byDateArray count]; i++){ 
     if([compareDates isEqualToString:[self.byDateArray objectAtIndex:i]]) 
     { 
      isAvail = YES; 
     } 
    } 
    if(!isAvail) 
     [self.byDateArray addObject:compareDates]; 
} 
int count = 0; 
for (int i = 0 ; i < [self.byDateArray count] ; i ++){ 
    NSString *compareDates = [self.byDateArray objectAtIndex:i]; 
    for(NSManagedObject *info in self.listOfExpenses){ 
     if([compareDates isEqualToString:[dateFormatter stringFromDate:[info valueForKey:@"date"]]]) 
     { 
      count++; 
     } 
    } 
    [self.byDateCountArray addObject:[NSNumber numberWithInt:count]]; 
    count = 0; 
} 
self.byDateTab.hidden = NO; 
self.byDateTab.frame = CGRectMake(0, 123, 320, 244); 
[self.view addSubview:self.byDateTab]; 
} 

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
if(tableView == self.byDateTab) 
    return [self.byDateArray count 
return 3; 
} 

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
int rows; 
if(tableView == self.byDateTab) 
    rows = [[self.byDateCountArray objectAtIndex:section] intValue]; 
return rows; 
} 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

UITableViewCell *cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellIdentifier"]autorelease]; 
if (tableView == self.byDateTab) 
{ 
for(int i = 0; i < [self.byDateCountArray count];i++) 
{ 
    if(indexPath.section == 0) 
    { 
     NSManagedObject *records = nil; 
     records = [self.listOfExpenses objectAtIndex:indexPath.row]; 

     self.firstLabel.text = [records valueForKey:@"category"]; 
     self.secondLabel.text = [records valueForKey:@"details"]; 

     NSString *amountString = [NSString stringWithFormat:@"%@",[records valueForKey:@"amount"]]; 
     self.thirdLabel.text = amountString; 
    } 
    else if (indexPath.section == i) 
    { 
     int rowCount = 0; 
     for(int j=0; j<indexPath.section; j++) 
     { 
      rowCount = rowCount + [[self.byDateCountArray objectAtIndex:j]intValue]; 
     } 
     NSManagedObject *records = nil; 
     records = [self.listOfExpenses objectAtIndex:(indexPath.row + rowCount) ]; 

     self.firstLabel.text = [records valueForKey:@"category"]; 
     self.secondLabel.text = [records valueForKey:@"details"]; 

     NSString *amountString = [NSString stringWithFormat:@"%@",[records valueForKey:@"amount"]]; 
     self.thirdLabel.text = amountString; 
    } 
} 
} 

Но я получаю ошибку SIGABRT в этой строке

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{ 
return [self.byDateArray objectAtIndex:section]; 
} 

я получаю следующее сообщение об ошибке в NSLog

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSCFArray objectAtIndex:]: index 2 beyond bounds for empty array' 
+0

есть ли только один стол? – adali

+0

no i have 6 tableviews – ichanduu

+0

В этой точке ваш массив byDateArray пуст. Его ясный в журнале ошибок его высказывания за пределами применяют точку прерывания или перед использованием [self.byDateArray objectAtIndex: section]; зарегистрировать счет byDateArray и раздел или использовать точку брека – superGokuN

ответ

0

проблема здесь

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    if(tableView == self.byDateTab) 
     return [self.byDateArray count]; 
    //why crashed at index 2, because here is 3 
    return 3; 
} 

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{ 
    return [self.byDateArray objectAtIndex:section]; 
} 

он падает на другой таблеток что не Ситуация в сфере «self.byDateTab»

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{ 
    if(tableView == self.byDateTab) 
    { 
     return [self.byDateArray objectAtIndex:section]; 
    } 
    else 
    { 
     //you should deal with other tableview 
     // it crashed here 
    } 
} 

или просто отключить заголовок раздела другого Tableview в

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    if(tableView == self.byDateTab) 
     return [self.byDateArray count]; 

    //i don't see other tableviews how to work, so if you do this, the code will work 
    //then you should look back to the solution above 
    return 0; 
} 
+0

Спасибо. Работает. – ichanduu

0

По ошибке Ваш self.byDateArray не имеет какой-либо объект с индексом 2, поэтому, пожалуйста, проверьте содержимое ваш массив.

+0

если я удалю этот метод, я получаю записи в порядке без каких-либо разделов – ichanduu

0

Ваш byDateArray кажется пустым.

Что вы делаете с [self.byDateArray removeAllObjects];?

+0

У меня есть другой tableViews, в котором я использую тот же массив! .so я освобождаю it.so, это причина, по которой я получаю сообщение об ошибке? – ichanduu

+0

Почему вы возвращаете '3' в' numberOfSectionsInTableView'. Существует также '];' отсутствует. – pre

0

Как упоминалось выше, проблема заключается в добавлении объектов к вам self.byDateArray Может быть self.byDateArray не инициализирован? Пожалуйста, сделайте NSLog(@"self.byDateArray: %@",self.byDateArray) незадолго до [self.byDateArray removeAllObjects]; в вашем -(IBAction)bydate:(id)sender методе.

0

Это означает, что значение

section

больше, чем

self.byDateArray 

кол.

Попробуйте добавить это в 1-й строке кода:

NSLog(@" %@ ", self.byDateArray); 

в - (NSString *) Tableview: функцию увидеть содержимое массива.