Navigation Stack should contain only ONE view - uinavigationcontroller

I have a Navigation Controller and a tableView with several Entries. If i select an Entry a new DetailViewController gets pushed. in the DetailViewController you can swipe right to push the DetailViewController of the next Entry of the tableView. Its working pretty well, but if people swipe about 10 times, they need to press the back button 10 times to get back to the tableView. So I'm looking for a nice way for people pressing back and coming to the tableView.
I thought about recreating the backbutton and use the popToRootViewControllerAnimated:
but is there another way i can solve my problem?
maybe something like deleting all views on the navigation stack and keep only the last one.

Instead of pushing a new DetailViewController you could just update the details with the details from the next/previous Entry from the tableview.
You would lose the swipe/push animation, but this could be worked around.
Another possibility is to use:
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
You'll need to work out what index the tableViewController is. If it's the root view controller then the index should be 0.

Related

Adding UIImagePickerController onto an already open UIPopoverController

I have a popover which contains a tableview, once a row has been selected I want to then push on a UIImagePickerController.
According to the documents on the Apple website, I can only present this in a new view controller. How do I present a popover, in a popover? Or is there another way to do it?
The easiest way is to create a delegate and dismiss the tableview on didSelectRowAtIndex using either an exit unWind segue or by dismissing the popover manually using a delegate. Then present the popOver containing the UIImagePickerController. You could also just use the delegate to display a popover along with the tableview although that probably would look cluttered.

How to create a multiview application in xcode 4 using UINavigation Controller without a TableView?

I'm new to iPhone development. I would like to understand how to create a multiview application without TableView. The brief description of the program is: it includes three views, each one has a button. When user taps button it takes him to the next screen going in a circle. 1-2.2-3.3-1.
Two things are most important:
How to get rid of TableView and use NavigationController without it?
How to get back from the third view to the first one?
If you're just using UINavigationController with UIView's it is pretty easy. Have a view or button on view 1, that intercepts the touch action.
Shows binding a touch action to the button on your view 1
[button2 addTarget:self action:#selector(button2Pressed:) forControlEvents:UIControlEventTouchUpInside];
This shows how the method pushes a new controller to the navigation. You can do this on view 2 to take you to view 3 as well.
-(void)button2Pressed:(id)sender {
UIView view2 = [[[UIView alloc] init] autorelease];
[self.navigationController pushViewController:view2 animated:YES];
}
Finally, if you want to get back to view 1
[self.navigationController popToRootViewControllerAnimated:YES];
The best way to learn about the various options is to check out the documentation UINavigationController.

UITabBarController not using NavigationController

I'm using MonoTouch and my application setup looks something like this,
NavController
-TabBarController
-NavController
-View1
This works then I click on a tab and am directed to View1. The problem is that this was performed by the tabBarController and not the navigationController. So I get no Back button. Is there a way to capture a TabItemClicked event and manually use the NavigationController to push the View1 onto the stack? So I can get a back button.
I'm hiding the TabBar once I get to View1, so at the moment, there is no way back from View1.
Hope it may help you
http://21gingerman.wordpress.com/2009/04/06/tutorial-and-sample-code-for-iphone-app-with-tab-bar-and-nav-bar/

How can I popViewController to rootViewController?

Let me specific. I have three XIBs. From the first XIB i used pushViewController and got into the second. From the button click in second XIB i got into the third. The thing is, On the click of Cancel button in third ViewController I have to go the first XIB. How is this possible? I am stuck there. Help me please. I used the navigationController to push the viewControllers. I have already used the popToRootViewController: but it popped only to the second XIB.
use this
[self.navigationController popToRootViewController:YES];

Substitution of detail view controller does not cause viewWillAppear to be called

I'm porting my iPhone app to iPad. On iPhone I select row in the table, and after that the next view controller is pushed to the top of navigationController (now navigation is performed on the left part of split view controller). For iPad i modified the code this way:
if (deviceIsIPad())
{
UISplitViewController *svc = (UISplitViewController *)[self findNearestParentOfClass:[UISplitViewController class]];
svc.viewControllers = [NSArray arrayWithObjects:[svc.viewControllers objectAtIndex:0],
nextViewController,
nil];
}
else
[self.navigationController pushViewController:nextViewController animated:YES];
There are no problem at iPhone code (when controller is pushed to navigation controller), but on iPad viewWillAppear: is not called (viewDidLoad is called however), while I have a reason to perform some customization right in viewWillAppear:. Why is it not called, and what should I do to force it to be called?
Much thanks in advance!
Not exactly sure what you're trying to do here but simply initializing a splitview controller and adding controllers to it does not force views to appear. You have to add the splitview controller's views to the window.
Here is the code from the Xcode Splitview template's app delegate's applicationDidFinishLaunching:
splitViewController = [[UISplitViewController alloc] init];
splitViewController.viewControllers = [NSArray arrayWithObjects:navigationController, detailViewController, nil];
splitViewController.delegate = detailViewController;
NSLog(#"master=%#",splitViewController.viewControllers);
// Add the split view controller's view to the window and display.
[window addSubview:splitViewController.view];
[window makeKeyAndVisible];
The views in the navigation controller appear because it is already attached to the window and displaying the view of one of its controlled controllers.
Edit:
From Comments:
All initialization code you are quoted
here is already performed. Now, let's
assume one have a table on the left
controller, then he select another row
there, and want to replace right
controller with another one.
splitViewController.view is added on
the window фдкуфвн, because some GUI
elements initialized in viewDidLoad,
are properly presented on view
It sounds like your problem arises because the detail (right-side) view of a splitview controller is always visible i.e. it only appears i.e calls viewWillAppear, once immediately after first being loaded. There is no point at which the detail side has no view present. I'm not sure what entirely swapping out viewControllers of the splitview will do.
If you want to change the detail view on the fly. You need to put a navigation controller in the right side and then push and pop view-controllers in that nav in response to events in the right side controller.
Look at how the iPad iPod app works. You have a leftside view of playlist and on the right side, a list of all the songs in the playlist. Selecting a song pushes a song detail view on top the list of songs.

Resources