应用程序重新启动后,某些重写的UITableView方法未被调用

时间:2017-06-15 19:50:55

标签: ios objective-c

我第一次运行程序时,正在调用所有覆盖的UITableView方法。但是如果我在模拟器中终止应用程序并从模拟器主屏幕重新启动,则不会调用某些被覆盖的方法(例如commitEditingStyle),而是调用预设方法。

有没有理由说他们在重新启动应用后不会被调用,但是在明确运行后会有效?

我的表格代码:

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // set toolbar delegate for editing toolbar style
    self.aToolbar.delegate = self;

    numberOfSections = 1; // for editing: initial number of sections

    // for testing
    NSLog(@"%@", ptrBookmarks1);

    // load bookmarks segment bar with user's most recent segment selections
    bookmarksSegmentControl.selectedSegmentIndex = selectedBookmarksSegmentIndex;

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    self.navigationItem.rightBarButtonItem = self.editButtonItem;

    //allow row selection during editing.
    //if the "Add New Song" row is selected we can trigger an insert.
    //rather than forcing the using to click the (+) icon directly
    self.aTableView.allowsSelectionDuringEditing = YES;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}



#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.

    // selected table data
    NSMutableArray *tableData;
    switch (bookmarksSegmentControl.selectedSegmentIndex) {
        case 0: // Bookmarks 1 selected
            tableData = ptrBookmarks1;
            break;
        case 1: // Bookmarks 2 selected
            tableData = ptrBookmarks2;
            break;
        case 2: // My Songs selected
            tableData = ptrMySongs;
            break;
    }

    if ([self isEditing]) // the current view is in editing mode, return count + an extra row
        return [tableData count] + 1;
    else // return count
        return [tableData count];

}

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

    if(cell == nil){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }

    // selected table data
    NSMutableArray *tableData;
    switch (bookmarksSegmentControl.selectedSegmentIndex) {
        case 0: // Bookmarks 1 selected
            tableData = ptrBookmarks1;
            break;
        case 1: // Bookmarks 2 selected
            tableData = ptrBookmarks2;
            break;
        case 2: // My Songs selected
            tableData = ptrMySongs;
            break;
    }

    //if number of rows is greater than the total number of rows in the data set
    //and this view is in editing mode.
    //Initialize the cell for "Add New Song"
    //there will be an extra row once SetEditing: is called
    if(indexPath.row >= tableData.count && [self isEditing]){
        cell.textLabel.text = @"Add New Song";
        //cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; // display arrow accessory
    }
    else {
        cell.textLabel.text = [tableData objectAtIndex:indexPath.row];
        //cell.accessoryType = UITableViewCellAccessoryNone; // hide arrow accessory
    }
    return cell;

}


//VIEW CONTROLLER METHOD: IMPORTANT
//this is a method of the view controller
//if we use apple's editing button as follows:
//self.navigationItem.rightBarButtonItem = self.editButtonItem
//then this method will be called automatically for us.
//if we are using a button callback or similar method,
//then we need to call setEditing: manually on the view
-(void) setEditing:(BOOL)editing animated:(BOOL)animated{

    //wrap our code in an if statement
    //only run the code if we are not swipe deleting a row.
    //if we were called due to a swipeDelete action, ignore it
    if(isSwipeDeleting == NO){
        //call parent
        [aTableView setEditing:editing];
        [super setEditing:editing animated:animated];


        // selected table data
        NSMutableArray *tableData;
        switch (bookmarksSegmentControl.selectedSegmentIndex) {
            case 0: // Bookmarks 1 selected
                tableData = ptrBookmarks1;
                break;
            case 1: // Bookmarks 2 selected
                tableData = ptrBookmarks2;
                break;
            case 2: // My Songs selected
                tableData = ptrMySongs;
                break;
        }


        //if editing mode
        if(editing){
            //batch the table view changes so that everything happens at once
            [self.aTableView beginUpdates];
            //for each section, insert a row at the end of the table
            for(int i = 0; i < numberOfSections; i++){
                //create an index path for the new row
                NSIndexPath *path = [NSIndexPath indexPathForRow:tableData.count inSection:i];
                //insert the NSIndexPath to create a new row. NOTE: this method takes an array of paths
                [self.aTableView insertRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationAutomatic];
            }
            //animate the changes now
            [self.aTableView endUpdates];
        }else{
            //batch the table view changes so that everything happens at once
            [self.aTableView beginUpdates];
            //for each section, insert a row at the end of the table
            for(int i = 0; i < numberOfSections; i++){
                //create an index path for the new row
                NSIndexPath *path = [NSIndexPath indexPathForRow:tableData.count inSection:i];
                //insert the NSIndexPath to create a new row. NOTE: this method takes an array of paths
                [self.aTableView deleteRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationAutomatic];
            }
            //animate the changes now
            [self.aTableView endUpdates];
        }
    }
}


//DELEGATE METHOD:
//this method will be called for every row and allows us to set the
//editing syle icon(Delete,Insert)
-(UITableViewCellEditingStyle) tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{

    // selected table data
    NSMutableArray *tableData;
    switch (bookmarksSegmentControl.selectedSegmentIndex) {
        case 0: // Bookmarks 1 selected
            tableData = ptrBookmarks1;
            break;
        case 1: // Bookmarks 2 selected
            tableData = ptrBookmarks2;
            break;
        case 2: // My Songs selected
            tableData = ptrMySongs;
            break;
    }

    // Detemine if it's in editing mode
    if (self.editing) {
        //use the + icon(add icon) on row
        //if this is the additional row created in setEditing:animated:
        if(indexPath.row >= tableData.count){
            return UITableViewCellEditingStyleInsert;
        }
        else {
            //use the delete icon on this row
            return UITableViewCellEditingStyleDelete;
        }
    }
    else
        return UITableViewCellEditingStyleNone;
}


//handle the deletion/insertion
//this method is called when the delete or insert icon has been press.
//we should update our dataSource by inserting or removing the selected INDEX
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    // selected table data
    NSMutableArray *tableData;
    switch (bookmarksSegmentControl.selectedSegmentIndex) {
        case 0: // Bookmarks 1 selected
            tableData = ptrBookmarks1;
            break;
        case 1: // Bookmarks 2 selected
            tableData = ptrBookmarks2;
            break;
        case 2: // My Songs selected
            tableData = ptrMySongs;
            break;
    }

    if (editingStyle == UITableViewCellEditingStyleDelete) { // the delete icon was clicked
        // delete pre-test
        NSLog(@"Array before delete: %@", tableData);
        NSLog(@"Directory before delete: ");
        [self readDirectoryContents];

        // if deleting a song or its pages that's in view, switch view to previous MySong if exists, otherwise About page/a blank page
        ////////insert code here////////

        // remove file and its annotations from directory (if deleting from My Songs)
        if (tableData == ptrMySongs) {
            [self deleteImportedSongsheet:tableData[indexPath.row]];

        }

        //remove row from tableData
        [tableData removeObjectAtIndex:indexPath.row];

        //remove the row in the tableView
        [self.aTableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];


        // delete post-test
        NSLog(@"Array after delete: %@", tableData);
        NSLog(@"Directory after delete: ");
        [self readDirectoryContents];

        [self.aTableView reloadData];
    }
    else if (editingStyle == UITableViewCellEditingStyleInsert) { // the insert icon was clicked
        /*
        //add a new row to the datasource
        [tableData addObject:@"New Icon"];
        //insert a row in the tableView because the plusIcon was clicked.
        [self.aTableView insertRowsAtIndexPaths:@[indexPath]
                              withRowAnimation:UITableViewRowAnimationAutomatic];*/

        self.editing = false; // turn off editing

        // ---SEGUE TO SONG IMPORT OPTIONS TABLE---
        SongImportView *songImportView =
            [[SongImportView alloc]
             initWithNibName:@"SongImportView" bundle:nil];

        // forward the My Songs array
        songImportView.ptrMySongs = ptrMySongs;

        // set delegate
        songImportView.delegate = self;

        // push SongImportView
        [self.navigationController pushViewController:songImportView animated:YES];

        [SongImportView release];
    }
}

//if we are in editing mode we do not want to perform Seque Transition
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
    if ([identifier isEqualToString:@"MyDetailView"] && [self isEditing]) {
        return NO;
    }
    return YES;
}


//this method is called when the user swipes to delete a row.
- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath{
    isSwipeDeleting = YES;//user just swipe to delete a row
}
//when the user cancel the swipe or click the delete button
//this method is call
- (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath{
    isSwipeDeleting = NO;//swipe to delete ended. No longer showing the DELETE button in cell
}

// Override to support conditional rearranging of the table view.
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return NO if you do not want the item to be re-orderable.
    return NO;
    //return YES;
}

// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {

    // MUST CHANGE canMoveRowAtIndexPath TO ENABLE THIS

    NSString *item;

    // selected table data
    NSMutableArray *tableData;
    switch (bookmarksSegmentControl.selectedSegmentIndex) {
        case 0: // Bookmarks 1 selected
            tableData = ptrBookmarks1;
            break;
        case 1: // Bookmarks 2 selected
            tableData = ptrBookmarks2;
            break;
        case 2: // My Songs selected
            tableData = ptrMySongs;
            break;
    }

    item = [[tableData objectAtIndex:fromIndexPath.row] retain];
    [tableData removeObjectAtIndex:fromIndexPath.row];
    [tableData insertObject:item atIndex:toIndexPath.row];

    [item release];
}

#pragma mark - Table view delegate

//DELEGATE METHOD:
//the user selected a row
//In order for the user to perform an INSERTION action on a row,
//they have to click the + icon icon. We can implement this method
//so that they can click anywhere on the "Add New Song" to add a new row
//tableView.allowsSelectionDuringEditing = YES; must be set
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    //deselect the selected row with animatiion
    [self.aTableView deselectRowAtIndexPath:indexPath animated:YES];

    // selected table data
    NSMutableArray *tableData;
    switch (bookmarksSegmentControl.selectedSegmentIndex) {
        case 0: // Bookmarks 1 selected
            tableData = ptrBookmarks1;
            break;
        case 1: // Bookmarks 2 selected
            tableData = ptrBookmarks2;
            break;
        case 2: // My Songs selected
            tableData = ptrMySongs;
            break;
    }

    //if the selected  row was the "Add New Song" row call tableView:commitEditingStyle:
    //to add a new row
    if (indexPath.row >= tableData.count && [self isEditing]) {
        [self tableView:tableView commitEditingStyle:UITableViewCellEditingStyleInsert forRowAtIndexPath:indexPath];
    }
    else { // otherwise do regular table item selection
        [self.delegate didTapBookmarksTable:[tableData objectAtIndex:indexPath.row]];
    }

}


// to scroll the table to the top row that was last viewed
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:YES];

    NSIndexPath *iP;

    switch (bookmarksSegmentControl.selectedSegmentIndex) {
        case 0: // Bookmarks 1 selected
            if ([ptrBookmarks1 count] > 0) { // make sure that there is something in the table before scrolling to it, otherwise will crash

                iP = [NSIndexPath indexPathForRow:bookmark1listPositionRow inSection:bookmark1listPositionSection];
                [aTableView scrollToRowAtIndexPath:iP atScrollPosition:UITableViewScrollPositionTop animated:NO];
            }
            break;
        case 1: // Bookmarks 2 selected
            if ([ptrBookmarks2 count] > 0) { // make sure that there is something in the table before scrolling to it, otherwise will crash

                iP = [NSIndexPath indexPathForRow:bookmark2listPositionRow inSection:bookmark2listPositionSection];
                [aTableView scrollToRowAtIndexPath:iP atScrollPosition:UITableViewScrollPositionTop animated:NO];
            }
            break;
        case 2: // My Songs selected
            if ([ptrMySongs count] > 0) { // make sure that there is something in the table before scrolling to it, otherwise will crash

                iP = [NSIndexPath indexPathForRow:mysongslistPositionRow inSection:mysongslistPositionSection];
                [aTableView scrollToRowAtIndexPath:iP atScrollPosition:UITableViewScrollPositionTop animated:NO];
            }
            break;
    }


}

// remember the top row that was last viewed
- (void)viewDidDisappear:(BOOL)animated {

    NSIndexPath *ip;

    switch (bookmarksSegmentControl.selectedSegmentIndex) {
        case 0: // Bookmarks 1 selected
            if ([ptrBookmarks1 count] > 0) { // make sure that there is something in the table before scrolling to it, otherwise will crash
                ip = [[aTableView indexPathsForVisibleRows] objectAtIndex:0];
                bookmark1listPositionSection = ip.section;
                bookmark1listPositionRow = ip.row;
            }
            break;
        case 1: // Bookmarks 2 selected
            if ([ptrBookmarks2 count] > 0) { // make sure that there is something in the table before scrolling to it, otherwise will crash
                ip = [[aTableView indexPathsForVisibleRows] objectAtIndex:0];
                bookmark2listPositionSection = ip.section;
                bookmark2listPositionRow = ip.row;
            }
            break;
        case 2: // My Songs selected
            if ([ptrMySongs count] > 0) { // make sure that there is something in the table before scrolling to it, otherwise will crash
                ip = [[aTableView indexPathsForVisibleRows] objectAtIndex:0];
                mysongslistPositionSection = ip.section;
                mysongslistPositionRow = ip.row;
            }
            break;
    }

}

0 个答案:

没有答案