2013-11-17 3 views
0

Я хочу удалить из uitableview и сделать его пишущим на моем plist. Я довольно новыми для этой Objective-C кодирования IOS, так что простите меня за ошибкиУдалить из uitableview + написать plist не работает

Сейчас с моим кодом разбился с этим:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (11) must be equal to the number of rows contained in that section before the update (11), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).' 

Вот мой код в моем mainViewcontroller

- (void)viewWillAppear:(BOOL)animated{ 
// Property List.plist code 
//Gets paths from root direcory. 
NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); 
//Get documents path. 
NSString *documentsPath = [paths objectAtIndex:0]; 

//Get the path to our PList file. 
plistPath = [documentsPath stringByAppendingPathComponent:@"Servers.plist"]; 

//Check to see if Property List.plist exists in documents. 
if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath]){ 
    [[NSFileManager defaultManager]copyItemAtPath:[[NSBundle mainBundle]pathForResource:@"Servers" ofType:@"plist"] toPath:plistPath error:nil]; 
    //If not in documents, get property list from main bundle. 
} 
arrayA = [[NSMutableArray alloc] initWithContentsOfFile:plistPath]; 
NSLog(@"%@\n%@", arrayA, [arrayA valueForKey:@"Hostname"]); 

tableData = [arrayA valueForKey:@"Hostname"]; 
[super viewWillAppear:animated]; 
[self.tableView reloadData]; 
} 


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 

    return [tableData count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

{ 
static NSString *cellIdentifier = @"showServerAction"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

if (cell == nil) { 

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 

} 

cell.textLabel.text = [tableData objectAtIndex:indexPath.row]; 

return cell; 

} 
    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 

if (editingStyle == UITableViewCellEditingStyleDelete) { 
    [tableView beginUpdates]; 

    [arrayA writeToFile:plistPath atomically: TRUE]; 
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    [tableView endUpdates]; 
} 
} 

UPDATE вот как выглядит мой plist. это NSMutableArray plist

ответ

3

Попробуйте это:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (editingStyle == UITableViewCellEditingStyleDelete) { 

    [tableView beginUpdates]; 

    // You are going to modify the table view, but you also need 
    // to modify the data source of your table. Since tableData 
    // is derived from the content of arrayA, the actual data 
    // source is arrayA, so we start with that (also, arrayA is 
    // a mutable array, so we are allowed to remove objects from 
    // it). 
    [arrayA removeObjectAtIndex:indexPath.row]; 

    // Now we also need to modify tableData. If you don't do this, 
    // tableData will report the wrong number of rows when 
    // numberOfRowsInSection() is called the next time. This is the 
    // direct source of the error that you mention in your question 
    // (carefully read the error message, it's really meaningful!). 
    // A small problem is that tableData is not a mutable array, 
    // so we cannot use removeObjectAtIndex: to modify it (that's 
    // probably the source of the error you got with Ilya's answer). 
    // The solution is to simply recreate tableData from scratch 
    // from the content of arrayA. 
    tableData = [arrayA valueForKey:@"Hostname"]; 

    [arrayA writeToFile:plistPath atomically: TRUE]; 
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 

    [tableView endUpdates]; 
    } 
} 
+0

esxuce меня, но как я могу это сделать? – KennyVB

+0

@KennyVB Я отредактировал свой ответ, надеюсь, что это поможет (мой первоначальный ответ был только наполовину правильным в любом случае). – herzbube

0

Вы должны изменить tableData после удаления, после чего перезарядка вид таблицы, как это:

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:<#(NSUInteger)#>] withRowAnimation:<#(UITableViewRowAnimation)#>];//With animation 

или перезагружать всю таблицу без анимации:

[self.tableView reloadData]; 

instea d из: [tableView beginUpdates];[tableView endUpdates];

необходим код:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 

    if (editingStyle == UITableViewCellEditingStyleDelete) { 

    [tableData removeObjectAtIndex:indexPath.row]; 
[arrayA setValue:tableData ForKey:@"Hostname"]; 
     [arrayA writeToFile:plistPath atomically: TRUE]; 
     [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationFade]; 

    } 
    } 
+0

это вызывает новую ошибку. *** Завершение приложения из-за неперехваченного исключения «NSInvalidArgumentException», причина: '- [__ NSArrayI removeObjectAtIndex:]: нераспознанный селектор, отправленный экземпляру 0x8b520d0' – KennyVB

+0

, так что да, я все еще получаю эту ошибку при использовании вашего кода – KennyVB

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