#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];
В этом табличном представлении есть разделы -> континенты.
Ну, моя проблема в том:
При переходе к другому кончику он должен прочитать название страны и отобразить его в заголовке и метке. Так оно и есть, но только для европейских стран. Если я нажму на страну другого континента, я увижу какую-нибудь европейскую страну. Пожалуйста, посмотрите скриншоты
Нажатие на европейскую страну -> Бельгия, показывает вправо.
Переход к африканскому разделу:
Записываю Анголу и получаю Австрию.
Итак, индекс Анголы — 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 — это Европа. Посмотрите любую документацию, доступную для использования.