#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:
Похоже, что ваш 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];