2015-02-05 2 views
0

Я использую tableView с настраиваемыми заголовками разделов. Все работает так, как ожидалось, но порядок разделов не отвечает, как я ожидал. Это словарные данные, которые я использую. В моей желаемой последовательности я хочу, чтобы «предстоящий» был как 1-й, так и «Посещался» как 2-й раздел, но порядок, который он показывает, полностью противоположный этому.UITableView разделы не работают

tableSection = @{@"Upcoming" : @[@"Amit", @"Vatsala", @"Jasmine",  @"Jasmine", @"Jasmine"], 
       @"Attended" : @[@"Kritarth", @"Rahul"] }; 

Прошу предложить помощь!

#pragma mark - UITableView delegate  
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return [tableSection count]; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    return 150; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection: (NSInteger)section { 
    return 25; 
} 

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    // Return the number of rows in the section. 
    NSString *sectionTitle = [tableSectionTitles objectAtIndex:section]; 
    NSArray *sectionAnimals = [tableSection objectForKey:sectionTitle]; 
    return [sectionAnimals count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *simpleTableIdentifier = @"SimpleTableCell"; 
    AppointmentTableCell *cell = (AppointmentTableCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 
    if (cell == nil) { 
     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"AppointmentTableCell" owner:self options:nil]; 
     cell = [nib objectAtIndex:0]; 
    } 
    //Configure the cell... 
    NSString *sectionTitle = [tableSectionTitles objectAtIndex:indexPath.section]; 
    NSArray *sectionArray = [tableSection objectForKey:sectionTitle]; 
    cell.nameLabel.text = [sectionArray objectAtIndex:indexPath.row]; 
    cell.doctorImageView.image = [UIImage imageNamed:@"doctor.png"]; 
    [cell.nameLabel setFont:FONT_OPENSANS_LIGHT(14)]; 

     return cell; 
} 
+0

Можете ли вы показать нам какой-нибудь код? Все ваши методы tableView-delegate были бы хорошим началом. – TMob

+0

Я попробовал тот же код после удаления массива. Тем не менее он дает мне тот же порядок разделов. – Arti

+0

Извините, что я удалил свой комментарий и просто дал ему ответ. Был ли заказ tableSectionTitles в том порядке, в котором вы хотели? Это должно быть просто вопросом того, чтобы быть в правильном порядке, а остальное должно было встать на свои места. –

ответ

0

Почему вы не массив отдельно только для титулов Table View?

_arrayTitles = @[@"Upcoming",@"Attended"]; 

И один массив, который содержит два массива для Sections data source:

NSArray *[email protected][@"Amit", @"Vatsala", @"Jasmine", @"Jasmine", @"Jasmine"]; 
NSArray *[email protected][@"Kritarth", @"Rahul"]; 
[email protected][arraySectionOne, arraySectionTwo]; 

И в 'viewForHeaderInSection' вы установили названия из этого массива:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{ 
    YourHeaderView *headerView=nil; 

    headerView=[tableView dequeueReusableHeaderFooterViewWithIdentifier:@"YourHeaderView"]; 
    headerView.titleHeader.text = _arrayTitles[section]; 
    return headerView; 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 

    // Return the number of sections. 
    return _arrayTitles.count; 
} 

- (NSInteger)tableView:(UITableView *)tableView 
numberOfRowsInSection:(NSInteger)section 
{ 
    NSMutableArray *arraySection=_dataSource[section]; 
    return arraySection.count; 
} 
+0

Это потому, что в настоящее время у меня есть только 2 массива, но в будущем это число увеличится на 5-10. В этом случае использование 10 различных массивов не очень хорошо. – Arti

1

Я вижу, вы фактически получая заголовок из отдельного массива, называемого tableSectionTitles, и потому, что вы используете строку в этом массиве, чтобы получить всю информацию о строке, это объясняет, почему заказ будет отличаться ferent. Я не вижу массив tableSectionTiltles в коде, который вы указали, но, по моему мнению, именно в этом случае проблема возникает.

EDIT

Как указано в комментариях tableSectionTitles на самом деле массив приходит из [tableSection AllKeys]; Поскольку NSDictionary на самом деле не имеет другого, массив поступает в любом порядке. Вы можете исправить это двумя способами.

Вручную поместите ключи словаря в этот массив в другом, но вы бы менее масштабируемы.

Создайте подкласс NSObject с заголовкомString и rowStringsArray (назовите это что-то лучше для того, для чего вы строите приложение), а затем добавьте эти объекты в массив и используйте их для генерации вашей таблицы.

Я надеюсь, что это поможет.

+0

tableSection = @ {@ "Предстоящие": @ [@ "Amit", @ "Vatsala", @ "Жасмин", @ "Жасмин", @ "Жасмин"], @ "Посещение": @ [@ "Kritarth" , @ "Rahul"]}; tableSectionTitles = [tableSection allKeys]; Описание: Описание массива tableSectionTitles. – Arti

+0

Это будет проблема там allKeys, с которой я столкнулся с этой проблемой еще раньше. Вы ожидаете, что он вернется в том порядке, в котором вы создаете NSDictionary, но NSDictionary на самом деле не имеет порядка. Я обновляю свой ответ, чтобы включить его в другие решения, которые вы, возможно, захотите рассмотреть. –

0

Способ построения полностью общего назначения DataSource это:

  • Есть самый верхний sections NSMutableArray.
  • Для каждого раздела вставьте NSMutableDictionary.
  • Вставьте элемент «title» (string) в словаре для заголовка раздела.
  • Вставьте NSMutableArray в словаре с ключом «rows».
  • Для каждой строки создайте NSMutableDictionary, чтобы содержать фактические данные для этой строки таблицы (и, конечно, вставить их в массив «rows»).

Вы можете добавить другие элементы в словарь по мере необходимости, конечно, и если вы один из тех, кто получает шорты в узле об эффективности, вы можете заменить словари целевыми объектами ,

Для таблицы с одним разделом откажите массив sections и словарь.

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