Я следую этому форуму: 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;
}
}
Дополнение: Я уверен, что он должен делать с 'prepareForSegue', потому что, когда я вхожу' 'didSelectRowAtIndexPath я получить нужную информацию. – Nicholas
Конечно, я не прочитал весь ваш код, но если это происходит в 'prepareForSegue', и у вас есть несколько разделов, но вы только переходите к информации в первом разделе, возможно, это из-за этой строки:' PFObject * object = [self.objects objectAtIndex: indexPath.row]; 'где объект, захваченный из массива' objects', зависит только от строки без учета раздела. Поэтому, если выбрана строка 1 в разделе 2, если ваши данные находятся в стандартном порядке, вы все равно перейдете к строке 1 раздела 1. –
У меня есть больше, чем писать, чем поместится в комментарии, поэтому я поставлю правильный ответ ... Если я ошибаюсь, но не стесняйтесь, дайте мне знать. –