Добавление разделов в список для Xcode для использования в Какао Touch Table View - PullRequest
0 голосов
/ 11 января 2010

Я начинающий программист iPhone SDK.Я создал простое практическое приложение, которое я пытаюсь использовать, чтобы узнать больше о табличных представлениях.Это приложение, которое загружает футбольные команды из списка и отображает их в виде таблицы с названием стадиона и логотипом.Нажатие на команду приводит к подробному представлению для этой команды.

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

Я бы предположил, что мне нужно как реструктурировать мой plist, так и изменить код для чтения массивов с разных уровней plist?

Для начала у меня был plist с корневым массивомсостоит из 3 словарей, по одному для каждой команды.Каждый словарь имел 3 ключа, «имя», «стадион» и «логотип».Это отлично работает.Я загружаю его через:

NSString *path = [[NSBundle mainBundle] pathForResource:@"teams" ofType:@"plist"];
teams = [[NSMutableArray alloc] initWithContentsOfFile:path];

, а затем

// Configure the cell.
NSDictionary *team = [teams objectAtIndex:indexPath.row];
cell.textLabel.text = [team objectForKey:@"name"];
NSString *imgPath = [team valueForKey:@"logo"]; 
cell.imageView.image = [UIImage imageNamed:imgPath];
cell.detailTextLabel.text =[team objectForKey:@"stadium"];
return cell;

Нет проблем.Но теперь я хотел разделы, поэтому я изменил свой plist на:

<array>
<dict>
    <key>teams 1</key>
    <array>
        <dict>
            <key>name</key>
            <string>Packers</string>
            <key>stadium</key>
            <string>Lambeau Field</string>
            <key>logo</key>
            <string>packers.jpg</string>
        </dict>
        <dict>
            <key>name</key>
            <string>Jets</string>
            <key>stadium</key>
            <string>Giants Stadium</string>
            <key>logo</key>
            <string>jets_logo.jpg</string>
        </dict>
    </array>
</dict>
<dict>
    <key>teams 2</key>
    <array>
        <dict>
            <key>name</key>
            <string>Cincinnati Bengals</string>
            <key>stadium</key>
            <string>Paul Brown Stadium</string>
            <key>logo</key>
            <string>bengals.jpg</string>
        </dict>
    </array>
</dict>

И я не уверен, как изменить viewDidLoad, чтобы назначить разделы одному уровню NSArray и командам ""в другой массив.

1 Ответ

0 голосов
/ 12 января 2010

Прежде всего, вам нужно использовать массивы для двух верхних уровней вашей структуры данных. Словари не упорядочены, что затрудняет их использование в качестве источника данных для формата таблицы. Можно использовать их для данных каждой записи, отображаемой в отдельной ячейке. Чтобы использовать словари в качестве данных табличного формата, необходимо сохранить их ключи в массиве, чтобы у каждого ключа был определенный числовой индекс, который таблица может использовать для поиска ключа.

В вашем классе UITabelViewDataSource вам потребуется что-то вроде следующего:

@property(nonatomic, retain)  NSArray *sectionNames;
...
NSArray *sectionNames=[teams allKeys];

В вашем классе UITabelViewDataSource вам понадобятся следующие методы:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return [self.sectionNames count];
}

Возвращает количество разделов в таблице, которое в вашем случае представляет количество объектов в вашем словаре верхнего уровня.

- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section{
    return [[teams valueForKey:[self.sectionNames objectAtIndex:section] count];
}

Возвращает количество строк в каждом разделе, которое в вашем случае означает количество объектов в каждом словаре второго уровня, возвращаемое для ключа, сохраненного в каждом элементе sectionName.

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
       return [self.sectionNames objectAtIndex:section];
}

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...