2013-02-14 1 views
1

У меня есть UITableView, который заполняется ключами массива из NSMutableDictionary.iOS - Как получить метку строки таблицы из commitEditingStyle

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

Я использую этот код для загрузки словаря:

NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); 
// get documents path 
NSString *documentsPath = [paths objectAtIndex:0]; 
// get the path to our Data/plist file 
NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"Data.plist"]; 
NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithContentsOfFile:(NSString *)plistPath]; 

и это, чтобы удалить массив из словаря:

[dictionary removeObjectForKey:]; 

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

Приветствия,

Chris

<plist version="1.0"> 
<dict> 
    <key>(null)</key> 
    <array> 
     <string>Username</string> 
     <string>Password</string> 
     <string>http://www.google.com</string> 
     <string>/whatever</string> 
    </array> 
    <key>Hello</key> 
    <array> 
     <string>admin</string> 
     <string></string> 
     <string>https://www.whatever.com</string> 
     <string>/things</string> 
    </array> 
</dict> 
</plist> 

cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ViewerName"]; 

     UILabel *label = (UILabel *)[cell viewWithTag:1000]; 
     label.text = [viewerKeys objectAtIndex:indexPath.row]; 
     return cell; 
} 

Удалить Код:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); 
    // get documents path 
    NSString *documentsPath = [paths objectAtIndex:0]; 
    // get the path to our Data/plist file 
    NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"Data.plist"]; 
    NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithContentsOfFile:(NSString *)plistPath]; 
    NSString *key = [viewerKeys objectAtIndex:indexPath.row]; 
    [dictionary removeObjectForKey:[NSString stringWithFormat:@"%@", key]]; 

    [self.tableView reloadData]; 

    NSArray *indexPaths = [NSArray arrayWithObject:indexPath]; 
    [tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationAutomatic]; 
} 
+0

'[[dictionary allKeys] objectAtIndex: indexPath.row]' – 2013-02-14 17:00:57

+0

Показать несколько строк вашего plist. (В Xcode щелкните правой кнопкой мыши и «Открыть как» -> «Исходный код»). Пожалуйста, поместите это в свой ** вопрос ** не как комментарий. – Mundi

+0

@ H2CO3 Я думаю, что это не гарантирует правильный порядок .... – Mundi

ответ

1

Никогда не получить данные из ячейки таблицы. У вас уже есть структуры данных, которые вы использовали для заполнения ячейки таблицы, чтобы получить данные из тех же структур данных.

У вас должен быть какой-то массив на месте, чтобы вы могли получить правильные данные для каждой ячейки. Используйте тот же массив, чтобы получить данные для удаляемой строки.

Если вы указали код для своего метода cellForRowAtIndexPath:, может быть предоставлен более конкретный ответ. Но это в основном тот же код для получения данных на основе indexPath.

Код, который вы опубликовали, пока показывает только словарь. Словарь не является хорошей основой для структуры на основе строк, такой как таблица.

Update: на основе кода от вашего cellForRowAtIndexPath:, все, что вам нужно:

NSString *key = [viewerKeys objectAtIndex:indexPath.row]; 

Update 2: Почему вы загрузив файл снова в методе commitEditingStyle? Вам необходимо изменить существующую структуру данных, которую вы уже загрузили для таблицы. В настоящее время у вас есть структуры данных, используемые таблицей. Затем в commitEditingStyle вы снова загружаете данные, удаляете запись из этих временных данных, затем вы указываете, что таблица перезагружается. Перезагрузка будет использовать исходные структуры данных, а не временные данные.

Также не назовите оба reloadData и deleteRowsAtIndexPaths:. Просто позвоните одному или другому.

И эта линия:

[dictionary removeObjectForKey:[NSString stringWithFormat:@"%@", key]]; 

должно быть:

[dictionary removeObjectForKey:key]; 

Не используйте stringWithFormat, если вы на самом деле есть строка, что вы форматирования.

+0

'- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath { UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: @" ViewerName "]; UILabel * label = (UILabel *) [cell viewWithTag: 1000]; label.text = [viewerKeys objectAtIndex: indexPath.row]; возвратная ячейка; } ' –

+0

Пожалуйста, внесите этот код в свой вопрос, а не комментарий. – rmaddy

+0

См. Мой обновленный ответ. – rmaddy