开发者

Table view cell disappear when i switch to another page and then back

开发者 https://www.devze.com 2023-03-30 04:56 出处:网络
I have a table view that you can add and delete cells. I can enter multiple cells and when i go to the next page and then switch back, all of my entries/ cells are erased. Can any one figure this out?

I have a table view that you can add and delete cells. I can enter multiple cells and when i go to the next page and then switch back, all of my entries/ cells are erased. Can any one figure this out? Here is my code:

@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

Thanks :D


Actually even unloading of the view will be enough to throw away the cells. Try this in your viewDidLoad:

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

(this way you won't be rereading the array every time the view is loaded).

And if you want the added cells to persist between app restarts, you do need to save them somewhere. You can't change the files in the main bundle, but you can write your own file into the Caches folder, which you can get via:

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

Write your file into that folder and read the cells from there instead of the main bundle. If you have some pre-defined cells in the main bundle file, you can check if the file in the Caches folder exists when the app starts, and if not, copy the bundle's file into the Caches folder.

Edit: if you do presentModalViewController to get back from the another page, you'll get a fresh copy of FacePlatesViewController, which obviously loads the default cells from the file. Instead, you should add a "delegate" property to your FirstFolderViewController:

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

then when presenting FirstFolderViewController do:

- (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];
}

Then add a method to FacePlatesViewController:

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

and in your FirstFolderViewController, when you are ready to close it, do:

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

Ironically, if you had implemented the cell persistence in a file, this issue might have been unnoticed (because each new FacePlatesViewController would load an up-to-date cell list), but you would have had a memory leak each time you went between pages.


To me, the problem seems to be related to your code in ViewWillAppear: Have you ensured that your cells array is fine when you call [self.myTableView reloadData]; ?

Also, I noticed myTableView. Are you subclassing UITableViewController or implementing table delegates? If you are subclassing, the table view reference is named tableView.

HTH,

Akshay

0

精彩评论

暂无评论...
验证码 换一张
取 消