Открытие неправильного файла с соответствующим объектом в табличном представлении

#objective-c #xcode #uitableview

#objective-c #xcode #uitableview

Вопрос:

Эй, ребята, я внедряю табличное представление в свой проект. Сначала я заполнил свою таблицу, затем мне удается успешно создать 4 категории и указать количество строк в каждой из этих категорий, но вот моя проблема. Первая категория (которая содержит 7 объектов) работает нормально, когда для каждого данные в этой категории открывают свои собственные файлы с наконечником. Но во второй категории, в которой есть 3 объекта, эти 3 объекта фактически открывают файлы nib из первой категории, а это не то, что я хочу. Я создал и назначил каждому объекту в моем табличном представлении свои собственные файлы с наконечником для открытия, но, как я уже сказал, объекты из второй, а также третьей и четвертой категорий открывают файлы с наконечником из первой категории. Вот мой код, как я разделяю объекты в моем табличном представлении:

 #pragma mark -
#pragma mark Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
    return 4;
}

// Category
- (NSString *)tableView:(UITableView *)tableView
titleForHeaderInSection:(NSInteger)section
{
    if (section == 0) return @"Category 1";
    if (section == 1) return @"Category 2";
    if (section == 2) return @"Category 3";
    if (section == 3) return @"Category 4";
    return @"Other";
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    if (section == 0) return 7;
    if (section == 1) return 3;
    if (section == 2) return 6;
    if (section == 3) return 5;
    return 0;
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell...
    NSUInteger row = [indexPath row];
    if ( indexPath.section == 1 ) row  = 7;
    if ( indexPath.section == 2 ) row  = 10;
    if ( indexPath.section == 3 ) row  = 16;
    if ( indexPath.section == 4 ) row  = 21;
    cell.textLabel.text = [glossaryArray objectAtIndex:row];

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    return cell;
}
  

и открыть каждую ячейку:

     - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        [tableView deselectRowAtIndexPath:indexPath animated:YES];

    if ([[glossaryArray objectAtIndex:indexPath.row] isEqual:@"First View Controller"]) {
        FirstViewController *firstVC = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
        [self.navigationController firstVC animated:YES];
        [firstVC release];
    }
    else if ([[glossaryArray objectAtIndex:indexPath.row] isEqual:@"Second View Controller"]) {

        SecondViewController *secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
        [self.navigationController pushViewController:secondViewController animated:YES];
        [secondViewController release];
    }
    else if (...
  

Примерно так мои файлы наконечника открывают каждое представление, но, как и снова, проблема в том, что они не открывают свои собственные представления, они открывают файлы наконечника из первой категории, то есть неправильные файлы наконечника. Sop Я надеюсь, что кто-нибудь может помочь мне разобраться в этой проблеме, спасибо

Ответ №1:

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

В вашем didSelectRowAtIndexPath: вы используете indexPath.row, не проверяя, в каком разделе indexPath.вы находитесь. Строка равна 0 на основе раздела, а не абсолютному количеству строк в вашем табличном представлении. В итоге получается что-то вроде

Раздел 0 Строка 0 Строка 1

Раздел 1 Строка 0 Строка 1

Вот документация по дополнениям NSIndexPath UIKit:

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/NSIndexPath_UIKitAdditions/Reference/Reference.html#//apple_ref/doc/uid/TP40007175

Похоже, что ваш glossaryArray пытается исправить это с помощью абсолютного индекса, поэтому раздел 1, строка 1 становится индексом 3 в glossaryArray. Однако происходит то, что indexPath.row возвращает 1 вместо ожидаемых 3.

Вам придется сопоставить 2-мерный indexPath с одним измерением или обновить ваш glossaryArray, чтобы он был 2-мерным.

Комментарии:

1. привет, спасибо, но я не совсем уверен, как отобразить двумерный массив. Я объявил свой glossaryArray glossaryArray = [[NSMutableArray alloc] init]; при загрузке просмотра, затем я объявил все свои объекты [glossaryArray addObject:@"object1"]; [glossaryArray addObject:@"object2"]; ... more , но примерно в этом случае я не знаю, как кодировать в двумерном массиве anl, надеюсь, вы сможете мне помочь, спасибо

2. На самом деле вы уже выполняете сопоставление в своем коде под комментарием \ настройте ячейку… в методе cellForRowAtIndexPath: Пока количество элементов в вашем массиве и каждом разделе не изменится, это будет работать.

3. Более надежным решением (но потребует от вас изменения всей существующей логики) было бы создать массив массивов (2-мерный) glossaryArray = [[NSMutableArray alloc] init]; categoryOneArray = [[NSMutableArray alloc] init]; [categoryOneArray addObject:@"object1"]; [glossaryArray addObject:categoryOneArray]; Для ссылки тогда вы бы использовали [[glossaryArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];