Как я могу получить NSIndexPath (для UITableCell) по текстовым данным ячейки? - PullRequest
2 голосов
/ 23 февраля 2012

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

<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 также будет в порядке.

Редактировать: здесь ниже мой 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;   
 }

Редактировать: вот откуда берутся группы секвенсора и секвенсор:

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

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

NSArray *array = [sequencer allKeys];

self.sequencerGroups = array;

Большое спасибо, Максим

Ответы [ 2 ]

3 голосов
/ 23 февраля 2012

Для создания indexPath из rowNumber вы можете использовать: [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];

.
1 голос
/ 23 февраля 2012

Я бы искал идентификатор в списке, чтобы определить, что такое раздел и строка.Тогда я бы создал 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: animated:

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