Проблема с UITableView .plist UINavigationController

#objective-c #ios #ios4

#objective-c #iOS #ios4

Вопрос:

В качестве моего первого приложения я пытаюсь освоить простое приложение для нумизматической коллекции на основе навигации.

Есть некоторые проблемы с индексами в моем массиве, заполненными из .plist. Список содержит 191 запись; обычный список стран -> элемент 0 — Строка — Албания … элемент 190 — Строка — Вануату.

Я считываю эти записи в свой временный массив для заполнения UITableView.

 NSString *countriesFile=[[NSBundle mainBundle]pathForResource:@"countries" ofType:@"plist"];
countries=[[NSArray alloc]initWithContentsOfFile:countriesFile];
  

В этом табличном представлении есть разделы -> континенты.

RootViewController моего приложения

Ну, моя проблема в том:

При переходе к другому кончику он должен прочитать название страны и отобразить его в заголовке и метке. Так оно и есть, но только для европейских стран. Если я нажму на страну другого континента, я увижу какую-нибудь европейскую страну. Пожалуйста, посмотрите скриншоты

Нажатие на европейскую страну -> Бельгия, показывает вправо.

введите описание изображения здесь

Переход к африканскому разделу:

введите описание изображения здесь

Записываю Анголу и получаю Австрию.

введите описание изображения здесь

Итак, индекс Анголы — 92. Австрия — 1. Но Австрия и Ангола являются второй ячейкой в их родной секции.

В чем проблема и в чем она может быть?

Заранее спасибо.

Ответ №1:

Я предполагаю, что вы используете -(void)tableView: (UITableView*)tableView didSelectRowAtIndexPath: (NSIndexPath*)indexPath , чтобы сообщить, когда вы нажали на элемент в списке? Кроме того, используете [indexPath row] ли вы (или indexPath.row ) для определения индекса строки, на которую вы нажали?

row Свойство возвращает индекс строки в текущем разделе. Он НЕ возвращает абсолютный индекс строки для всей таблицы. Из-за этого не имеет значения, нажмете ли вы на элемент index two в первом разделе или на элемент index two во втором разделе, row в обоих этих случаях будет возвращено 2.

Идея заключалась бы в том, чтобы немного изменить файл .plist. Вместо того, чтобы иметь только один длинный массив стран, создайте родительский массив, представляющий континенты. Тогда у объекта для каждого индекса в этом массиве континентов есть другой массив, в котором будет содержаться список стран.

 -(void)tableView: (UITableView*)tableView didSelectRowAtIndexPath: (NSIndexPath*)indexPath
{
    NSUInteger section=[indexPath section];
    NSUInteger row=[indexPath row];
    NSString* countryName=[[plistArray objectAtIndex: section] objectAtIndex: row];
    //rest of code...
}
  

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

1. Что вы имеете в виду, чтобы изменить .plist? Как? Массив -> Коллекция?

2. Что ж, мой метод теперь выглядит следующим образом: — (void)TableView:(UITableView )TableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSUInteger section=[Раздел indexPath]; Строка NSUInteger=[Строка indexPath]; NSString countryName=[[страны objectAtIndex: раздел] objectAtIndex: строка]; Выбранная страна *Выбранная страна =[[Выделение выбранной страны] initWithNibName:@пакет «SelectedCountry»: ноль]; selectedCountry.selectedCountry = [Название страны objectAtIndex:indexPath.row]; [self.NavigationController pushViewController:анимация выбранной страны: ДА]; [Релиз выбранной страны]; }

3. Теперь он говорит: «NSString может не отвечать на «objectAtIndex». Должен ли я изменить тип переменной? К чему?

4. Ребята;-(, Стив Джобс скончался. Самое печальное новшество этого года. По крайней мере, для меня. R.I.P

5. @Nathan Для примера файла .plist: kendallp.net/public/files/stack.plist . Проверьте (своего рода) пример того, как должен выглядеть ваш метод: kendallp.net/public/files/stack.m . Как указано в комментарии, вам нужно будет изменить этот метод, чтобы он мог читать файл .plist, как я отформатировал его выше. Имеет ли это смысл?

Ответ №2:

Похоже, вы не принимаете во внимание значение раздела indexPath . indexPath состоит из двух частей: раздела и строки. В таблицах, содержащих один раздел, вы обычно просто считываете значение строки. В вашем случае похоже, что у вас есть сгруппированная таблица, поэтому вам нужно прочитать как indexPath.section, так и indexPath.row для определения местоположения данных.

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

1. Каждый континент представляет собой раздел. Итак, раздел 0 — это Европа. Посмотрите любую документацию, доступную для использования.