Question

In my app I have a list of items in a table view. Tapping on one of them, the app shows details of the item. Details appear and by back button of navigation controller, the app returns to list.

In the detail view I have implemented a method to swipe gesture in order to change the view to the details of the second element of the list and so on. It works.

The method that changes view is:

  - (void)oneFingerSwipeLeft:(UITapGestureRecognizer *)recognizer {

    int idx=currentIdx;

    if (idx ==[todasLasTapas count]-1) {   //last object vuelvo al primero
        idx= -1;
    }


    ClassInfo *info =[allInfo objectAtIndex:idx+1];

    //VIEW CONTROLLER
    MoreInfo *moreInfoController =[[MoreInfo alloc]initWithNibName:@"MoreInfoController" bundle:nil];

    //passing the details to view
    moreInfoController.id           = info.uniqueId;
    moreInfoController.name      = info.name;

    // CHANGE TO NEXT VIEW
    moreInfoController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self presentModalViewController:moreInfoController animated:YES];

}

The problem is that navigation controller disappears when the "second" view appears. My idea is that navigation remains in order to come back to the main table list.

Could someone help me please?

Was it helpful?

Solution

Unfortunately presenting modal view controllers happens outside of the UINavigationController stack. As a result, when you call presentModalViewController, you are bringing a controller onto the screen totally outside of stack of controllers managed by the UINavigationController.

You can preserve most of your implementation, but just switch out the presentation of the modal view controller, by simply adding MoreInfo's view as a subview to the current view.

If you'd like to preserve memory a little more gracefully, just switch between two UIView's (the currently showing view, and the next one to show - which is reused from the last detail view).

Here's an updated version of your code that could do this:

- (void)oneFingerSwipeLeft:(UITapGestureRecognizer *)recognizer {
    int idx=currentIdx;
    if (idx ==[todasLasTapas count]-1) {   //last object vuelvo al primero
        idx= -1;
    }
    ClassInfo *info =[allInfo objectAtIndex:idx+1];
    //VIEW CONTROLLER
    MoreInfo *moreInfoController =[[MoreInfo alloc]initWithNibName:@"MoreInfoController" bundle:nil];

    //passing the details to view
    moreInfoController.id = info.uniqueId;
    moreInfoController.name = info.name;
    [UIView transitionFromView:self.view
                        toView:moreInfoController.view
                      duration:2
                       options:UIViewAnimationOptionTransitionCrossDissolve 
                    completion:^(BOOL finished) {
                        [self.view removeFromSuperview];
                    }];
}

Here's a post that shows how to implement a custom animation to dissolve to another UIView:

How to make dissolve animation on changing views on iphone?

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top