2014-09-29 5 views
0

Я следую этому форуму: https://parse.com/questions/using-pfquerytableviewcontroller-for-uitableview-sectionsPFQueryTableViewController Несколько разделов

Если вы идете по ссылке выше и прочитать название, вы увидите, что я пытаюсь создать разделы в моем PFQueryTableViewController. После копирования формы кода ссылку выше я смог разделить мой TableView просто отлично .. он отлично работает! Вот моя проблема. (Лучший способ сделать это - привести пример). Представьте, у меня есть 3 секции клеток с 2-х ячеек в каждой секции

B

C D

E F

Когда я нажимаю на я получаю результат. Когда я нажимаю на B, я получаю результат B. Но когда я нажимаю на CI получить A, и когда я нажимаю на DI получить B. Кроме того, когда я нажимаю на EI Получить и когда я нажимаю на ФИ получить B.

В основном это знает, есть разделы, но это делая так, как будто есть 1 секция, которая непрерывно повторяет (3) раза.

Вот улов. Ячейки int TableView отображают правильную информацию. Это после того, как вы нажмете на ячейки, что неверная информация передана. Может быть, я что-то упустил, но не знаю, где.

Вот мой код:

@property (nonatomic, retain) NSMutableDictionary *sections; 
@property (nonatomic, retain) NSMutableDictionary *sectionToSportTypeMap; 

@implementation AllDataViewController 
@synthesize sections = _sections; 
@synthesize sectionToSportTypeMap = _sectionToSportTypeMap; 

- (id)initWithCoder:(NSCoder *)aCoder 
{ 
    self = [super initWithCoder:aCoder]; 
    if (self) { 
     // Custom the table 

     // The className to query on 
     self.parseClassName = @"schedule"; 
     self.textKey = @"name"; 
     self.pullToRefreshEnabled = YES; 

     self.paginationEnabled = YES; 
     self.objectsPerPage = 25; 
     self.sections = [NSMutableDictionary dictionary]; 
     self.sectionToSportTypeMap = [NSMutableDictionary dictionary]; 
    } 
    return self; 
} 

- (PFQuery *)queryForTable 
{ 
    PFQuery *query = [PFQuery queryWithClassName:self.parseClassName]; 

    // If Pull To Refresh is enabled, query against the network by default. 
    if (self.pullToRefreshEnabled) { 
     query.cachePolicy = kPFCachePolicyNetworkOnly; 
    } 

    // If no objects are loaded in memory, we look to the cache first to fill the table 
    // and then subsequently do a query against the network. 
    if (self.objects.count == 0) { 
     query.cachePolicy = kPFCachePolicyCacheThenNetwork; 
    } 


     [query orderByAscending:@"order"]; 

    return query; 
} 
- (void) objectsDidLoad:(NSError *)error 
{ 
    [super objectsDidLoad:error]; 
    [self.sections removeAllObjects]; 
    [self.sectionToSportTypeMap removeAllObjects]; 

    NSInteger section = 0; 
    NSInteger rowIndex = 0; 
    for (PFObject *object in self.objects) { 
     NSString *sportType = [object objectForKey:@"order"]; 
     NSMutableArray *objectsInSection = [self.sections objectForKey:sportType]; 
     if (!objectsInSection) { 
      objectsInSection = [NSMutableArray array]; 

      // this is the first time we see this sportType - increment the section index 
      [self.sectionToSportTypeMap setObject:sportType forKey:[NSNumber numberWithInt:section++]]; 
     } 

     [objectsInSection addObject:[NSNumber numberWithInt:rowIndex++]]; 
     [self.sections setObject:objectsInSection forKey:sportType]; 
    } 
} 


- (PFObject *)objectAtIndexPath:(NSIndexPath *)indexPath { 
    NSString *sportType = [self sportTypeForSection:indexPath.section]; 
    NSArray *rowIndecesInSection = [self.sections objectForKey:sportType]; 
    NSNumber *rowIndex = [rowIndecesInSection objectAtIndex:indexPath.row]; 
    return [self.objects objectAtIndex:[rowIndex intValue]]; 
} 

#pragma mark - UITableViewDataSource 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return self.sections.allKeys.count; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    NSString *sportType = [self sportTypeForSection:section]; 
    NSArray *rowIndecesInSection = [self.sections objectForKey:sportType]; 
    return rowIndecesInSection.count; 
} 

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    NSString *sportType = [self sportTypeForSection:section]; 
    return sportType; 
} 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    [super tableView:tableView didSelectRowAtIndexPath:indexPath]; 

    PFObject *selectedObject = [self objectAtIndexPath:indexPath]; 
} 


- (NSString *)sportTypeForSection:(NSInteger)section { 
    return [self.sectionToSportTypeMap objectForKey:[NSNumber numberWithInt:section]]; 
} 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([segue.identifier isEqualToString:@"showDataDetail"]) { //showRecipeDetail 

     NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
     //PFObject *selectedObject = [self objectAtIndexPath:indexPath]; 
     DataDetailViewController *destViewController = segue.destinationViewController; 

     PFObject *object = [self.objects objectAtIndex:indexPath.row]; 
     AllData *data = [[AllData alloc] init]; 
     data.title = [object objectForKey:@"title"]; 
     data.imageFile = [object objectForKey:@"imageFile"]; 
     data.date = [object objectForKey:@"date"]; 
     data.information = [object objectForKey:@"information"]; 
     destViewController.data = data; 

    } 
} 
+0

Дополнение: Я уверен, что он должен делать с 'prepareForSegue', потому что, когда я вхожу' 'didSelectRowAtIndexPath я получить нужную информацию. – Nicholas

+0

Конечно, я не прочитал весь ваш код, но если это происходит в 'prepareForSegue', и у вас есть несколько разделов, но вы только переходите к информации в первом разделе, возможно, это из-за этой строки:' PFObject * object = [self.objects objectAtIndex: indexPath.row]; 'где объект, захваченный из массива' objects', зависит только от строки без учета раздела. Поэтому, если выбрана строка 1 в разделе 2, если ваши данные находятся в стандартном порядке, вы все равно перейдете к строке 1 раздела 1. –

+0

У меня есть больше, чем писать, чем поместится в комментарии, поэтому я поставлю правильный ответ ... Если я ошибаюсь, но не стесняйтесь, дайте мне знать. –

ответ

0

Если у вас есть несколько разделов в таблице, но вы только segueing к информации в первой секции независимо от раздела, выбранного вами, может быть, это из-за этой линии:

PFObject *object = [self.objects objectAtIndex:indexPath.row]; 

, где объект из захваченного массива self.objects зависит исключительно от строки без учета секции.

Так как ваш код стоит сейчас, если выбрана строка 1 раздела 2, если ваши данные находятся в стандартном порядке (например, A, B, C, D и т. Д.), Вы все равно перейдете к строке 1 в разделе 1. для того, чтобы получить код для работы по назначению, возможно, придется изменить эту строку:

PFObject *object = [self.objects objectAtIndex:indexPath.row]; 

к

PFObject *object = [self.objects objectAtIndex:indexPath.row * (indexPath.section + 1)]; 

таким образом, что нужно умножить (раздел + 1), чтобы получить доступ к правильный индекс в массиве self.objects.

+0

Большое вам спасибо! По какой-то причине, хотя это все еще не работает LOL! Вы наверняка думаете, что что-то совсем не работает. – Nicholas

0

Попробуйте вложенности ему ELSE заявление, если вот так

if (indexPath.section == 0) { 
     //A 
     if (indexPath.row == 0) { 
      PFObject *object = [self.messagesArray objectAtIndex:indexPath.row]; 
     } 
    } 
+0

Я не знаю, сколько строк и секций будет в конце, хотя – Nicholas

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