Таблица программирования iPhone - PullRequest
0 голосов
/ 20 февраля 2011

Я добавил таблицу в свое приложение, и с этой таблицей я добавил полосу прокрутки, как в iPhone. Свиток работает с буквами, но у меня есть проблема с ним, под буквой А я получаю названия буквы А, но в букве Б я получаю те же имена буквы А. Те же слова в .plist массива списка A повторяются во всех остальных списках. Что я могу сделать ??

Примечание: добавьте свой собственный файл .plist, чтобы увидеть, к какому результату он приведет.

#import "SimpleTableViewController.h"

@implementation SimpleTableViewController

@synthesize exercises;



- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {

    if(searching)
        return nil;

    NSMutableArray *tempArray = [[NSMutableArray alloc] init];
    [tempArray addObject:@"A"];
    [tempArray addObject:@"B"];
    [tempArray addObject:@"C"];
    [tempArray addObject:@"D"];
    [tempArray addObject:@"E"];
    [tempArray addObject:@"F"];
    [tempArray addObject:@"G"];
    [tempArray addObject:@"H"];
    [tempArray addObject:@"I"];
    [tempArray addObject:@"J"];
    [tempArray addObject:@"K"];
    [tempArray addObject:@"L"];
    [tempArray addObject:@"M"];
    [tempArray addObject:@"N"];
    [tempArray addObject:@"O"];
    [tempArray addObject:@"P"];
    [tempArray addObject:@"Q"];
    [tempArray addObject:@"R"];
    [tempArray addObject:@"S"];
    [tempArray addObject:@"T"];
    [tempArray addObject:@"U"];
    [tempArray addObject:@"V"];
    [tempArray addObject:@"W"];
    [tempArray addObject:@"X"];
    [tempArray addObject:@"Y"];
    [tempArray addObject:@"Z"];


    return tempArray;
}



- (void)viewDidLoad {



    NSString *myFile = [[NSBundle mainBundle] pathForResource:@"A" ofType:@"plist"];


    exercises = [[NSArray alloc]initWithContentsOfFile:myFile];
    [super viewDidLoad];


}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

    if (section ==0) return 5;
    if (section ==1) return 2;
    if (section ==2) return 5;
    if (section ==3) return 5;
    if (section ==4) return 6;
    if (section ==5) return 5;
    if (section ==6) return 5;
    if (section ==7) return 5;
    if (section ==8) return 5;
    if (section ==9) return 5;
    if (section ==10) return 5;
    if (section ==11) return 5;
    if (section ==12) return 5;
    if (section ==13) return 5;
    if (section ==14) return 5;
    if (section ==15) return 5;
    if (section ==16) return 5;
    if (section ==17) return 5;
    if (section ==18) return 5;
    if (section ==19) return 5;
    if (section ==20) return 5;
    if (section ==21) return 5;
    if (section ==22) return 5;
    if (section ==23) return 5;
    if (section ==24) return 5;
    if (section ==25) return 5;
    return 0;

}

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

    if (cell == nil)
    {
    cell=[[UITableViewCell alloc]
                           initWithStyle:UITableViewCellStyleSubtitle/*Default*/// change default to subtitle
                           reuseIdentifier:@"cell"];
    }





    cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
    //cell.accessoryType=UITableViewCellAccessoryDetailDisclosureButton;

    cell.textLabel.text=[exercises objectAtIndex:indexPath.row];
    cell.detailTextLabel.text=@"Click me...";

    return cell;
}


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

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:
(NSInteger)section
{ 
        if (section == 0) return @"Letter A";
        if (section == 1) return @"Letter B";
        if (section == 2) return @"Letter C";  
        if (section == 3) return @"Letter D";  
        if (section == 4) return @"Letter E";  
        if (section == 5) return @"Letter F";  
        if (section == 6) return @"Letter G";  
        if (section == 7) return @"Letter H";  
        if (section == 8) return @"Letter I";  
        if (section == 9) return @"Letter J";  
        if (section == 10) return @"Letter K";  
        if (section == 11) return @"Letter L";  
        if (section == 12) return @"Letter M";  
        if (section == 13) return @"Letter N";  
        if (section == 14) return @"Letter O";  
        if (section == 15) return @"Letter P";  
        if (section == 16) return @"Letter Q";  
        if (section == 17) return @"Letter R";  
        if (section == 18) return @"Letter S";  
        if (section == 19) return @"Letter T";  
        if (section == 20) return @"Letter U";  
        if (section == 21) return @"Letter V";  
        if (section == 22) return @"Letter W";  
        if (section == 23) return @"Letter X";  
        if (section == 24) return @"Letter Y";  
        if (section == 25) return @"Letter Z";  

        return @"Other";



}

- (void)viewDidUnload {
}


- (void)dealloc {
    [super dealloc];
}

@end

Ответы [ 2 ]

1 голос
/ 20 февраля 2011

Вы игнорируете номер секции в cellForRowAtIndexPath, поэтому, если, когда tableView запрашивает строку 1 секции 3 (четвертую запись в секции B), то вы возвращаете четвертую запись в массиве упражнений в «A" раздел.Вам нужно будет либо реструктурировать «упражнения», чтобы можно было индексировать по разделам (первая буква), а затем по строке ИЛИ вычислять соответствующую запись в упражнениях.

Вам следует прочитать документацию Apple по TableViews.См. Раздел «Создание и настройка табличного представления», который называется «Заполнение индексированного списка», чтобы получить помощь в создании массива массивов.В Apple TableView есть пример.

Если вы действительно не хотите реструктурировать свой plist в массив массивов, как это было предложено, то вы можете грубо заставить вычислить соответствующую строку в вашей матрице упражнений следующим образом ...

Вместо

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

Попробуйте:

int realRow = indexPath.row;
for (int i = 0; i < indexPath.section; i++ ) {
    realRow += [self tableView:tableView numberOfRowsInSection:i];
}

cell.textLabel.text=[exercises objectAtIndex:realRow];
0 голосов
/ 20 февраля 2011

вам определенно следует изменить структуру ваших данных. Я бы порекомендовал вам использовать вложенные массивы.

Вы бы создали один rootarray. И в этом массиве вы помещаете 26 массивов, где каждый массив содержит содержимое для одного раздела.

и вместо записи if (section ==0) return 5; if (section ==1) return 2; if (section ==2) return 5; if (section ==3) return 5; if (section ==4) return 6; ... вы можете написать return [[exercises objectAtIndex:section] count];

Одна строка вместо 26. Круто, не правда ли?

А в cellForRowAtIndexPath вы могли бы написать что-то вроде этого:

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