2012-02-23 2 views
2

В моем приложении у меня есть контроллер табличного представления, который строит таблицу с разделами из файла .plist. Каждая ячейка уникальна, поскольку она основана на параметре идентификатора, который хранится для каждого элемента в файле plist и не может повторяться. В качестве примера: PLISTКак я могу получить NSIndexPath (для UITableCell) текстовыми данными ячейки?

<dict> 
<key>Section One</key> 
<dict> 
    <key>Item 0</key> 
    <dict> 
     <key>name</key> 
     <string>Some name one</string> 
     <key>picfile</key> 
     <string>take8.png</string> 
     <key>takeItemId</key> 
     <integer>101</integer> 
    </dict> 
    <key>Item 1</key> 
    <dict> 
     ... 
    </dict> 
</dict> 
<key>Section Two</key> 
<dict> 
    <key>Item 0</key> 
    <dict> 
     <key>name</key> 
     <string>Some name two</string> 
     <key>picfile</key> 
     <string>take6.png</string> 
     <key>takeItemId</key> 
     <integer>103</integer> 
    </dict> 
    <key>Item 1</key>.... 

Так моя таблица состоит из ячеек, содержащих текстовую метку (takeItemID), изображение из файла и другой текстовой метки (Name). Теперь у меня есть событие, которое приносит идентификатор в виде строки (я получаю команды от подключения сокета tcp). И я хочу, чтобы моя таблица выделила (изменить фон) в тех ячейках, которые содержат полученную строку идентификатора в качестве соответствующей текстовой метки. Получение NSIndexPath каким-то образом из plist было бы также хорошо.

Edit: здесь ниже мой TableView: cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    {  
NSUInteger section = [indexPath section]; 
NSUInteger row = [indexPath row]; 

NSString *sGroup = [sequencerGroups objectAtIndex:section]; 
NSDictionary *tSection = [sequencer objectForKey:sGroup]; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SecuencerCell"]; 

NSString *takeItemName = [[[tSection allKeys] sortedArrayUsingSelector:@selector(compare:)] objectAtIndex:row]; 
NSDictionary *takeItem = [tSection objectForKey:takeItemName]; 

UILabel *idLabel = (UILabel *)[cell viewWithTag:104]; 
idLabel.text = [NSString stringWithFormat:@"%@",[takeItem valueForKey:@"takeItemId"]]; 

UILabel *nameLabel = (UILabel *)[cell viewWithTag:102]; 
nameLabel.text = [takeItem valueForKey:@"name"]; 

UIButton *piconButton = (UIButton *)[cell viewWithTag:101]; 
UIImage *TakeImage = [UIImage imageNamed:[takeItem valueForKey:@"picfile"]]; 
[piconButton setBackgroundImage:TakeImage forState:UIControlStateNormal]; 


UIButton *resumeButton = (UIButton *)[cell viewWithTag:103];  
UIImage *resumeImage = [UIImage imageNamed:@"resume.png"]; 
[resumeButton setBackgroundImage:resumeImage forState:UIControlStateNormal]; 



return cell; 
} 

Edit: вот где sequencerGroups и секвенсор взяты из:

NSString *path = [documentsDirectory stringByAppendingPathComponent:@"Sequencer.plist"]; 

NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path]; 
self.sequencer = dict; 
[dict release]; 

NSArray *array = [sequencer allKeys]; 

self.sequencerGroups = array; 

спасибо, Максим

+0

Tis может помочь вам http://borkware.com/quickies/one? topic = UITableView – fibnochi

+0

Не могли бы вы включить код для вашего 'tableView: cellForRowAtIndexPath:'? – dasblinkenlight

ответ

3

Чтобы создать индексную строку из строки номер, вы можете использовать: [NSIndexPath indexPathForRow:<#(NSInteger)#> inSection:<#(NSInteger)#>];

Это упрощает преобразование row-> indexPath, если у вас есть номера строк &.

Итак, тогда возникает вопрос: как мне получить строку & номера разделов с takeItemId.

Я думаю, что я подхожу к нему (существует множество способов, которые вы можете рассмотреть, однако, в зависимости от того, насколько критично время выполнения загрузки вашего plist) было бы - сразу после того, как я проанализирую plist, я бы построил NSDictionary который отображает takeItemId на IndexPath.

Пример:

NSDictionary *myPlist = ... 
NSMutableDictionary *mapKeyToIndexPath = [NSMutableDictionary dictionary]; 
NSUInteger section = 0; 
NSUInteger row = 0; 
for (id sectionKey in [myPlist allKeys]) { 
    // Parse Sections First 
    NSDictionary *section = [myPlist objectForKey:sectionKey]; 
    for (id rowKey in [section allKeys]) { 
     // Parse Rows Next 
     NSDictionary *row = [section objectForKey:rowKey]; 
     NSString *takeItemId = [row objectForKey:@"takeItemId"]; 

     NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row++ inSection:section]; 
     [mapKeyToIndexPath addObject:indexPath forKey:takeItemId]; 
    } 
    // Move to first row, next section 
    row = 0; 
    section ++; 
} 

После того как вы mapKeyToIndexPath словарь, вы можете захватить правильный indexPath когда вы получаете takeItemId в вашем мероприятии и передать его [myTableDataSource tableView:myTableView highlightCellAtIndexPath:indexPath];

+0

Примечание. Это решение «вы работаете», вам нужно быть более защищенным для производственного решения. например подтвердите правильные типы объектов, созданных plist, и изящно обработайте неожиданные типы. – ikuramedia

+0

Спасибо ikuragames! Мне нужно попробовать это. –

1

Я искал бы идентификатор в plist, чтобы определить, что такое раздел и строка. Тогда я создал бы NSIndexPath:

//create the indexPath with the value you got from plist 
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:(NSInteger) inSection:(NSInteger)]; 

//get the cell in the table myTable, and do what you want with it 
cell = [myTable cellForRowAtIndexPath:indexPath]; 

Вы также можете прокручивать ячейки с методом scrollToRowAtIndexPath: atScrollPosition: анимированный:

+0

Итак, что именно вы имеете в виду: «Ищите идентификатор в plist, чтобы определить, что такое раздел и строка« Franck? Это мой вопрос! –

Смежные вопросы