Ячейка табличного представления исчезает, когда я переключаюсь на другую страницу и затем возвращаюсь - PullRequest
0 голосов
/ 22 августа 2011

У меня есть табличное представление, в которое вы можете добавлять и удалять ячейки. Я могу ввести несколько ячеек, и когда я перехожу на следующую страницу и затем переключаюсь назад, все мои записи / ячейки стираются. Может ли кто-нибудь понять это? Вот мой код:

@implementation FacePlatesViewController

@synthesize woodGrain;
@synthesize nav, array;
@synthesize EditButton;
@synthesize myTableView, image;
@synthesize cell, string1;
@synthesize myDic, cells, defaults;
@synthesize selectedCell, currentChosenFund;


- (void)viewDidLoad {
[super viewDidLoad];
NSString * myFile = [[NSBundle mainBundle]pathForResource:@"cells" ofType:@"plist"];
self.myTableView.backgroundColor = [UIColor clearColor];
cells = [[NSMutableArray alloc]initWithContentsOfFile:myFile];

}


- (void)addObject:(id)anObject
{
if (anObject != nil)
{
    [cells addObject:anObject];
}
}

- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];

[self.myTableView reloadData];
}

- (IBAction)editButton:(id)sender 
{




if (self.editing) 
    {
        [self setEditing:NO animated:YES];
        [self.myTableView setEditing:NO animated:YES];

    } 

    else 
    {

        [self setEditing:YES animated:YES];
        [self.myTableView setEditing:YES animated:YES];

    }
}

- (void)add
{
    MyDetailViewController * detail = [[MyDetailViewController alloc]init];
    detail.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    [self presentModalViewController:detail animated:YES];
    [detail.text becomeFirstResponder];
    [detail release];

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [cells count];
}

- (void) tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle 
 forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete)
    {
        [[self cells] removeObjectAtIndex:[indexPath row]];

        NSArray *indexPaths = [NSArray arrayWithObject:indexPath];
        [[self myTableView] deleteRowsAtIndexPaths:indexPaths
                                  withRowAnimation:UITableViewRowAnimationFade];
    }

}

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

    static NSString *CellIdentifier = @"Cell";

    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero   
                                       reuseIdentifier:CellIdentifier] autorelease];
    }  
    //The if block should end here. You should set the cell's label irrespective whether the cell was nil. This is the cause of the issue you are facing.

    cell.textLabel.text = [[cells objectAtIndex:indexPath.row] valueForKey:@"name"];


    return cell;

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    FirstFolderViewController * first = [[FirstFolderViewController alloc]init];
    first.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self presentModalViewController:first animated:YES];
    [first release];
}

    - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}

- (void) tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath
       toIndexPath:(NSIndexPath *)targetIndexPath
{
    NSUInteger sourceIndex = [sourceIndexPath row];
    NSUInteger targetIndex = [targetIndexPath row];

    if (sourceIndex != targetIndex)
    {
        [[self cells] exchangeObjectAtIndex:sourceIndex
                          withObjectAtIndex:targetIndex];
    }

}

- (void)dealloc
{
    [woodGrain release];
    [myTableView release];
    [EditButton release];
    [nav release];
    [cells release];
    [myTableView release];
    [myDic release];
    [super dealloc];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];  
}

#pragma mark - View lifecycle

/*
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
    [super viewDidLoad];
}
*/

- (void)viewDidUnload
{
    [self setWoodGrain:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}


@end

Спасибо: D

Ответы [ 2 ]

1 голос
/ 22 августа 2011

На самом деле даже разгрузки вида будет достаточно, чтобы выбросить клетки.Попробуйте это в вашем viewDidLoad:

if(!cells) {
    NSString * myFile = [[NSBundle mainBundle]pathForResource:@"cells" ofType:@"plist"];
    self.myTableView.backgroundColor = [UIColor clearColor];
    cells = [[NSMutableArray alloc]initWithContentsOfFile:myFile];
}

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

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

[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];

Запишите свой файл в эту папку и прочитайте ячейки изтам вместо основного комплекта.Если у вас есть несколько предопределенных ячеек в основном файле комплекта, вы можете проверить, существует ли файл в папке Caches при запуске приложения, и если нет, скопировать файл комплекта в папку Caches.

РедактироватьЕсли вы сделаете presentModalViewController, чтобы вернуться с другой страницы, вы получите свежую копию FacePlatesViewController, которая, очевидно, загружает ячейки по умолчанию из файла.Вместо этого вы должны добавить свойство «делегат» в свой FirstFolderViewController:

@property(nonatomic, assign) id delegate; //yes, assign, not retain

, затем при представлении FirstFolderViewController выполните:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    FirstFolderViewController * first = [[FirstFolderViewController alloc]init];
    first.delegate = self;
    first.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self presentModalViewController:first animated:YES];
    [first release];
}

Затем добавьте метод в FacePlatesViewController:

- (void) onDoneWithFirstFolderViewController //you can come up with a better name
{
    [self dismissModalViewControllerAnimated:YES];
}

и в вашем FirstFolderViewController, когда вы будете готовы закрыть его, выполните:

if([delegate respondsToSelector:@selector(onDoneWithFirstFolderViewController)]) 
    [delegate onDoneWithFirstFolderViewController];

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

0 голосов
/ 22 августа 2011

Мне кажется, что проблема связана с вашим кодом в ViewWillAppear: Убедитесь, что с вашим массивом ячеек все в порядке, когда вы вызываете [self.myTableView reloadData];?

Также я заметил myTableView. Вы подклассы UITableViewController или реализуете делегаты таблицы? Если вы создаете подкласс, ссылка на табличное представление называется tableView.

НТН,

Акшай

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